Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/6196| Title: | Мобільний додаток для замовлення продуктів харчування |
| Authors: | Оксамитна, Любов Павлівна Передерій, Олександр Сергійович |
| Keywords: | ПРЕДМЕТНА ОБЛАСТЬ;МОБІЛЬНИЙ ДОДАТОК;ЛОГІСТИКА;ПРОЕКТУВАННЯ;БАЗА ДАНИХ;FIREBASE;ANDROID;FIGMA. |
| Issue Date: | 15-Jun-2023 |
| Abstract: | На сьогоднішній день замовлення продуктів харчування через Інтернет не є чимось новим і революційним. Однак, саме в останні роки ця індустрія почала стрімко розвиватися. До 2020 року ця бізнес-ніша вже оцінювалася в $32 млрд., тому мобільні додатки для доставки продуктів харчування та особливості їхньої розробки все частіше стають предметом обговорення серед підприємців. Найпопулярнішими критеріями є умови та порядок доставок (логістика доставок) і політика транспортування. Необхідність вирішення питань організації кур’єрної логістики, в тому числі і щодо замовлення продуктів харчування, її ефективне використання за допомогою сучасних інформаційних технологій обумовлює актуальність обраної теми кваліфікаційної роботи бакалавра. Мета кваліфікаційної роботи бакалавра – створення мобільного додатку для замовлення продуктів харчування. Об’єкт дослідження: процеси онлайн замовлень. Предмет дослідження: мобільний додаток для замовлення продуктів харчування. |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/6196 |
| Appears in Collections: | 122 Комп’ютерні науки (Комп’ютерні науки та прикладне програмування) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| Пояснювальна записка_Передерій Олександр_КН-2101_2022-2023.pdf Restricted Access | 3.19 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра комп’ютерних наук та системного аналізу
Пояснювальна записка
до кваліфікаційної роботи
бакалавра
(освітньо-кваліфікаційний рівень)
на тему: «Мобільний додаток для замовлення продуктів харчування»
Виконав: студент 4 курсу, групи КН-2101
спеціальності 122 «Комп’ютерні науки»
(шифр і назва спеціальності)
освітня програма «Комп’ютерні науки та
(назва освітньої програми)
прикладне програмування
Передерій Олександр Сергійович
Керівник __________ Оксамитна Л.П.
(прізвище та ініціали)
Рецензент __________ Стась С.В.
(прізвище та ініціали)
Черкаси 2023 року
Бланк завдання на кваліфікаційну роботу бакалавра студенту
Черкаський державний технологічний університет
Факультет Інформаційних технологій і систем
Кафедра Комп’ютерних наук та системного аналізу
Освітньо-кваліфікаційний рівень Бакалавр
Спеціальність 122 – Комп’ютерні науки
Освітня програма Комп’ютерні науки та прикладне програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри КНСА
_______________ Юрій ТРИУС
«____» _____________ 2023 р.
ЗАВДАННЯ
на кваліфікаційну роботу бакалавра студенту
Передерію Олександру Сергійовичу
(прізвище, ім’я, по батькові)
1. Тема роботи Мобільний додаток для замовлення продуктів харчування
Керівник роботи Оксамитна Л.П., к.т.н., доцент
(прізвище, ім’я, по батькові, науковий ступінь, вчене звання)
затверджені наказом університету від «24» лютого 2023 р. №43/04.
2. Строк подання студентом роботи до 12 червня 2023 року
3. Вихідні дані до роботи:
Практичні навики роботи з інформаційними ресурсами. Робота з базами даних.
Звіт з виробничої практики. Звіт з переддипломної практики.
4. Зміст пояснювальної записки (перелік питань, що їх належить розробити):
Вступ
4.1. Дослідження предметної області.
4.2. Проектування та розробка мобільного додатку для замовлення продуктів харчування «Fast
delivery».
4.3. Програмна реалізація.
Висновки.
5. Перелік додатків (з точним зазначенням назв додатків):
5.1. Додаток А. Специфікація 482.ЧДТУ. 32225-01.
5.2. Додаток Б. Текст програми.
5.3. Додаток В. Інструкція користувача.
5.4. Презентація у вигляді 35 слайдів.
6. Консультанти розділів роботи
Прізвище, ініціали та Підпис, дата
Розділ посада
завдання видав завдання прийняв
консультанта
7. Дата видачі завдання 11.01.2023
КАЛЕНДАРНИЙ ПЛАН
Строк виконання
№ з/п Назва етапів кваліфікаційної роботи бакалавра Примітка
етапів роботи
1 Видача завдання на кваліфікаційну роботу
11.01.2023 Виконано
бакалавра.
2 Аналіз літературних джерел, об’єкту та
до 13.02.2023 Виконано
предмету дослідження.
3 Написання теоретичного розділу
до 15.03.2023 Виконано
кваліфікаційної роботи бакалавра.
4 Написання аналітичного розділу кваліфікаційної
до 01.04.2023 Виконано
роботи бакалавра.
5 Написання практичних розділів й висновків до
до 01.05.2023 Виконано
кваліфікаційної роботи бакалавра.
6 Передзахист кваліфікаційної роботи бакалавра
01.06.2023 Виконано
на засіданні кафедри КНСА.
7 Подання роботи завідувачу кафедри КНСА. до 12.06.2023 Виконано
8 Захист кваліфікаційної роботи бакалавра. 15.06.2023 Виконано
Студент _____________________________ Передерій О. С.
(підпис)
Керівник роботи ____________________________ Оксамитна Л. П.
(підпис)
РЕФЕРАТ
Кваліфікаційна робота бакалавра містить: 60 с., 31 рис., 1 таблицю, 10
використаних джерел, 4 додатки.
Актуальність теми. На сьогоднішній день замовлення продуктів харчування
через Інтернет не є чимось новим і революційним. Однак, саме в останні роки ця
індустрія почала стрімко розвиватися. До 2020 року ця бізнес-ніша вже оцінювалася
в $32 млрд., тому мобільні додатки для доставки продуктів харчування та
особливості їхньої розробки все частіше стають предметом обговорення серед
підприємців. Найпопулярнішими критеріями є умови та порядок доставок (логістика
доставок) і політика транспортування. Необхідність вирішення питань організації
кур’єрної логістики, в тому числі і щодо замовлення продуктів харчування, її
ефективне використання за допомогою сучасних інформаційних технологій
обумовлює актуальність обраної теми кваліфікаційної роботи бакалавра.
Мета роботи і задачі дослідження. Мета кваліфікаційної роботи бакалавра –
створення мобільного додатку для замовлення продуктів харчування.
Для досягнення поставленої мети були поставлені такі завдання:
дослідити предметну область;
виконати порівняльний аналіз існуючих мобільних додатків для замовлення
продуктів харчування;
розробити базу даних;
обрати програмно-технічні засоби для реалізації мобільного додатку «Fast
delivery»;
розробити мобільний додаток для замовлення продуктів харчування «Fast
delivery» та виконати його тестування.
Об’єкт дослідження: процеси онлайн замовлень.
Предмет дослідження: мобільний додаток для замовлення продуктів
харчування.
Методи дослідження. Для вирішення поставлених завдань були застосовані
наступні методи дослідження: теоретичний (аналіз літератури з проблеми
дослідження); емпіричний – полягав у спостереженні та налаштуванні мобільного
додатку для замовлення продуктів харчування; порівняльний – для здійснення
порівнянь існуючих аналогів для замовлення продуктів харчування.
Перелік ключових слів: ПРЕДМЕТНА ОБЛАСТЬ, МОБІЛЬНИЙ ДОДАТОК,
ЛОГІСТИКА, ПРОЕКТУВАННЯ, БАЗА ДАНИХ, ANDROID, FIREBASE, FIGMA.
ABSTRACT
Master’s work contains. 60 pages, 31 figures, 1 table, 10 sources used, 4
attachments.
Actuality of theme. Today, ordering food via the Internet is not something new and
revolutionary. However, it is in recent years that this industry began to develop rapidly. By
2020, this business niche was already estimated at $32 billion, so mobile applications for
food delivery and the specifics of their development are increasingly becoming a topic of
discussion among entrepreneurs. The most popular criteria are terms and order of
deliveries (delivery logistics) and transportation policy. The need to solve the issues of
organizing courier logistics, including the ordering of food products, its effective use with
the help of modern information technologies determines the relevance of the chosen topic
of the bachelor's qualification work.
Purpose and tasks of the research. The goal of the bachelor's qualification work is
to create a site-exhibition of pyrographic paintings, which will increase the popularization
of this type of art.
To achieve this goal, the following tasks were set:
explore pyrography as an art form;
perform a comparative analysis of existing analogues of sites of pyrographic
paintings;
develop a database;
conduct an analysis of software solutions for the development of a site-exhibition of
pyrographic paintings;
to develop a site-exhibition of pyrographic paintings «Wood Burning Ukraine»;
develop a mobile application for ordering food "Fast delivery" and perform its
testing.
The object of research: website development.
The subject of research: website-exhibition of pyrographic paintings.
Research methods: The following research methods were used to solve the tasks:
theoretical (analysis of the literature on the research problem); empirical - consisted in
observing and configuring a mobile application for ordering food products; comparative -
for making comparisons of existing analogues for ordering food products.
The list of keywords: SUBJECT FIELD, MOBILE APP, LOGISTICS, DESIGN,
DATABASE, ANDROID, FIREBASE, FIGMA.
7
ЗМІСТ
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ ........ 9
ВСТУП ................................................................................................................................ 10
1 ДОСЛІДЖЕННЯ ПРЕДМЕТНОЇ ОБЛАСТІ ............................................................... 12
1.1 Аналіз сучасного стану замовлення продуктів харчування через мобільні
пристрої…………………… ........................................................................................... 12
1.2 Огляд існуючих аналогів сервісів для замовлення продуктів харчування ........ 15
1.2.1 Аналіз сервісу «Glovo» .................................................................................... 15
1.2.2 Аналіз сервісу «Raketa» ................................................................................... 17
1.2.3 Аналіз сервісу «UberEats» ................................................................................ 18
1.2.4 Аналіз сервісу «BoltFood» ............................................................................... 19
1.3 Аналіз порівнянь існуючих рішень розглянутих реалізацій та постановка
завдання……………….. ................................................................................................ 21
Висновки до розділу 1 ................................................................................................... 23
2 ПРОЕКТУВАННЯ МОБІЛЬНОГО ДОДАТКУ ДЛЯ ЗАМОВЛЕННЯ ПРОДУКТІВ
ХАРЧУВАННЯ «FAST DELIVERY» .............................................................................. 24
2.1 Опис функціонального програмного середовища для розробки ........................ 24
2.2 Основні принципи розробки мобільних додатків ................................................ 32
2.3 Архітектура мобільних додатків ............................................................................ 32
2.4 Розробка діаграми варіантів використання ........................................................... 38
2.5 Проектування структури бази даних .................................................................... 39
2.6 Опис процесу проектування структури мобільного додатку для замовлення
продуктів харчування .................................................................................................... 42
2.7 Проектування інтерфейсу користувача ................................................................ 44
Висновки до розділу 2 ................................................................................................... 47
3 ПРОГРАМНА РЕАЛІЗАЦІЯ ......................................................................................... 48
3.1 Постановка завдання ............................................................................................... 48
3.2 Інтерфейс мобільного додатку для замовлення продуктів харчування ............. 49
3.3 Програмна реалізація мобільного додатку «Fast delivery» …………………… . 49
8
3.4 Особливості тестування мобільного додатку ....................................................... 52
3.5 Тестування мобільного додатку «Fast delivery» ................................................... 54
Висновки до розділу 3 ................................................................................................... 62
ВИСНОВКИ ....................................................................................................................... 60
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ ......................................................................... 61
Додаток А. Специфікація 482.ЧДТУ. 32225-01 ……………………………………… 62
Додаток Б. Текст програми............................................................................................... 64
Додаток В. Інструкція користувача ................................................................................. 88
Додаток Г. Структура бази даних .................................................................................... 94
9
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ
СКБД – система керування базами даних;
БД – база даних;
ПЗ – програмне забезпечення;
Unit-testing – рівень тестування програмного забезпечення, на якому тестуються
окремі одиниці/компоненти програмного забезпечення;
AI – Artificial Intelligence;
UI/UX – User interface/User experience – поняття, які використовуються для опису
дизайну та функціональності сайту;
HTTP-протокол (Hyper Text Transfer Protocol) – протокол передачі гіпер-текстових
документів.
10
ВСТУП
В сучасному світі всі завдання максимально спрощені та оптимізовані.
Наприклад: купити продукти харчування – це легко, вибрати правильний подарунок
до свята, відвідати супермаркет чи аптеку. Люди замовляють їжу з доставкою
замість того, щоб готувати їжу вдома чи йти в ресторан. Кожен розробник може
знайти користь у дослідженні роботи служб доставки та створенні аналогічного
продукту, оскільки сучасні тенденції вказують на зростання популярності доставки
продуктів, книжок, ліків та канцелярії прямо до офісу або додому. Замість тратити
час на поїздку до магазину, люди зручно замовляють потрібні товари через різні
сервіси доставки. Хоча на ринку вже існує кілька таких служб, конкуренція не
заважає компаніям розробляти нові продукти, щоб задовольнити зростаючий попит.
Тому, розробники мають можливість здійснювати дослідження в цій сфері та
створювати конкурентоспроможні продукти, що відповідають потребам ринку.
Актуальність кваліфікаційної роботи бакалавра. Замовлення продуктів
харчування через мобільні пристрої набуває все більшої популярності серед
користувачів завдяки його зручності та швидкості. Основна перевага таких
мобільних додатків полягає в тому, що користувач може замовити продукти
харчування безпосередньо зі свого смартфону або планшету, вибравши з багатого
вибору страв. Крім того, ці додатки часто мають додаткові функції, які дозволяють
користувачам відстежувати статус свого замовлення, спілкуватися з рестораном або
кур'єром, а також економити час, оскільки інформація про ресторани та меню
доступна в одному місці. Звісно, такі додатки можуть мати й недоліки, наприклад,
можливі проблеми з доставкою або оплатою.
Мета кваліфікаційної роботи бакалавра – створення мобільного додатку для
замовлення продуктів харчування.
Для досягнення поставленої мети були поставлені такі завдання:
дослідити предметну область;
виконати порівняльний аналіз існуючих мобільних додатків для замовлення
продуктів харчування;
11
розробити базу даних;
обрати програмно-технічні засоби для реалізації мобільного додатку «Fast
delivery»;
розробити мобільний додаток для замовлення продуктів харчування «Fast
delivery» та виконати його тестування.
Об’єкт і предмет дослідження.
Об’єктом дослідження є процеси онлайн замовлень.
Предметом дослідження є мобільний додаток для замовлення продуктів
харчування.
Для вирішення поставлених завдань були застосовані наступні методи
дослідження: теоретичний (аналіз літератури з проблеми дослідження); емпіричний
– полягав у спостереженні та налаштуванні мобільного додатку для замовлення
продуктів харчування; порівняльний – для здійснення порівнянь існуючих аналогів
мобільних сервісів для замовлення продуктів харчування.
Мобільний додаток для замовлення продуктів харчування розроблений на
мові Java. Створення та робота з базою даних (БД) відбувалась із застосуванням
Firebase. Контроль проектування власної розробки та написання коду проводилось в
програмному середовищі Android Studio.
Обрані технології задовольняють всім функціональним і не функціональним
вимогам до такого типу програмного забезпечення (ПЗ).
12
1 ДОСЛІДЖЕННЯ ПРЕДМЕТНОЇ ОБЛАСТІ
1.1 Аналіз сучасного стану замовлення продуктів харчування через
мобільні пристрої
У 21 столітті зростає кількість людей, які використовують сервіси доставки, і
вони стають більш вимогливими, помічаючи недоліки в програмах. Користувачі
очікують широкого спектру функцій, які спрощують пошук товарів для доставки і
мінімізують особистий контакт з кур'єром або персоналом магазину. Багато сервісів
доставки пропонують обмежений функціонал, в той час як користувачі, очевидно,
бажають більшого. Сервіси доставки є одними з найактуальніших в сучасному світі
та є популярними й незамінними. Тому, у кваліфікаційній роботі бакалавра
розглядається проектування та розробка мобільного додатку для замовлення
продуктів харчування. Мобільний додаток для доставки продуктів харчування може
посприяти серйозному розвитку компанії, що володіє мережею ресторанів або
інших закладів громадського харчування. Це обумовлюється кількома причинами, а
саме:
1. Залучення нових клієнтів. З огляду на те, що частка мобільних користувачів
мережі вже давно перевершує десктопну платформу, додаток дозволяє
підприємствам охоплювати більшу аудиторію та успішно залучати нових клієнтів.
2. Підвищення лояльності. Чим швидші та зручніші методи замовлення
продуктів харчування пропонує ресторан, кафе або інший заклад, тим більшу
прихильність до його бренду проявляють клієнти.
3. Швидша окупність бізнесу. Завдяки впровадженню нових технологій компанія
отримує більше клієнтів, а упрощення системи замовлень сприяє підвищенню
прибутку та покращує коефіцієнт окупності бізнесу ROI.
Розглянемо принцип роботи додатку для доставки продуктів харчування.
Додаток для замовлення продуктів харчування може реалізовуватися в трьох
форматах, кожен з яких має свої особливості та переваги.
13
Агрегатори закладів. Тут компанії відповідають тільки за оформлення та
менеджмент замовлень з ресторанів, які перераховані в їхньому каталозі. Вони
стягують з закладів комісію 10-30% за кожне оброблене замовлення. Головний
мінус таких сервісів в тому, що поріг входу в цю нішу досить низький, а значить
конкуренція тут більш жорстка. Перевага ж полягає в тому, що з такою бізнес-
моделлю не потрібно турбуватися про готування і доставку продуктів харчування.
Сервіси для замовлень і доставки. Стратегія монетизації таких додатків має на
увазі стягнення у закладів 25-30% від суми оброблених для них замовлень. Також
тут є комісія за доставку, яка може бути фіксованою або змінюватися в залежності
від дистанції, що розділяє ресторан і клієнта. Недолік цієї моделі полягає в тому, що
компанії потрібно наймати та навчати кур’єрів, а це ускладнює менеджмент бізнесу
і може перешкодити його масштабуванню.
Брендований сервіс. У цьому випадку компанія робить ставку тільки на
власний бренд і створює додаток, який повністю відповідає його стилістиці. Такий
підхід підвищує обізнаність про заклад та залучає клієнтів, що позитивно впливає на
середній чек і загальну кількість замовлень.
Головні характеристики додатків для замовлення продуктів харчування.
При створенні такого мобільного додатку важливо враховувати потреби не
тільки клієнтів, але й кур’єрської служби. Ось які функції повинна включати кожна
з цих версій мобільного додатку (табл. 1.1).
Таблиця 1.1 – Потреби клієнтів та кур’єрської служби
Клієнтська версія Кур’єрська версія
Особистий кабінет з персональними Особистий кабінет з інформацією про
даними, включаючи платіжні реквізити, курєра, рейтиновою оцінкою його
адресу і т.п. роботи, відгуками клієнтів та інше.
Час доставки, відстеження в real-time Функція менеджменту замовлень, що
режимі. дозволяє приймати, відхиляти,
коментувати їх і т.п.
Грамотно реалізований функціонал Відображення статусу замовлення в
оплати. реальному часі.
Рейтинг закладів та відгуки про самі Продумана карта із закладами та
страви. оптимальними маршрутами.
Push-повідомлення про статус
замовлень.
14
Для управління додатком також потрібна окрема версія додатку з іншим
набором функцій. Адміністратор повинен мати доступ до профілів клієнтів і
кур’єрів, можливість змінювати контент додатку, обробляти замовлення і
відстежувати отримання платежів.
Основні етапи розробки мобільного додатку доставки продуктів харчування.
Розробка мобільного додатку доставки мобільного – це досить трудомісткий
процес, який включає 5 основних кроків.
1. Дослідження ринку замовлення продуктів харчування. Щоб перевершити
конкурентів, потрібно бути в курсі всіх найбільш актуальних трендів індустрії
доставки продуктів харчування. Бажано, щоб додаток мав можливість замовлення
страв через соціальні мережі, використання віртуального асистента або сумісний зі
smart-годинниками, що дозволяє клієнтам значно спростити процес замовлення.
2. Вибір бізнес-моделі. Провівши детальний аналіз ринкової ніші на предмет
цікавих тенденцій, необхідно визначитися з моделлю ведення бізнесу. Необхідно
проаналізувати основні характеристики агрегаторів закладів, сервісів для
замовлення / доставки та брендованих додатків, а потім вибрати формат, який
вдасться розвинути швидше за все.
3. Вивчення цільового ринку. Щоб створити мобільний додаток для доставки
продуктів харчування, потрібно якомога краще знати власних клієнтів і цільову
аудиторію. Тільки так можна виявити головні труднощі користувачів і розробити
свій сервіс таким чином, щоб він допомагав їм у розв’язанні цих проблем та
відповідав їхнім потребам.
4. Функціонал продукту. Набір функцій додатку залежить від бажаної моделі
ведення бізнесу. Якщо мова йде про стандартний агрегатор закладів, тут важливо
продумати якісний інтерфейс для клієнтів і адміністратора. Якщо ж в “рівняння”
додається ще й кур’єр, то потрібно займатися і функціоналом його версії сервісу.
5. Вибір технологій для реалізації. Для повноцінної роботи додатку необхідно
підібрати оптимальні технології, які б дозволили впровадити декілька ключових
аспектів / елементів. Це програмний інтерфейс (API) для створення каталогу
15
ресторанів, підключення платіжних шлюзів та використання функцій геолокації,
push-повідомлення і т. п.
1.2 Огляд існуючих аналогів сервісів для замовлення продуктів
харчування
В кваліфікаційній роботі бакалавра проведено огляд існуючих аналогів
сервісів для замовлення продуктів харчування провідних компаній, таких як:
«Glovo», «Raketa», «UberEats», «BoltFood.
1.2.1 Аналіз сервісу «Glovo». Першим розглянемо сервіс «Glovo». Сервіс
«Glovo» відрізняється від інших тим, що вони доставляють «все що завгодно», як
зазначено на головній сторінці їхнього сайту.
На рис. 1.1 представлена головна сторінка сервісу для замовлення продуктів
харчування «Glovo» та загальний вигляд секції «Найпопулярніше», що на рис. 1.2.
За словами журналістки Дарії Янченко з Retailers, в сервісі «Glovo» є деякі
недоліки.
По-перше, неповністю зрозуміло, як саме встановлюється ціна на продукт: чи
за вагу, упаковку чи окрему одиницю товару.
По-друге, виявилася ситуація, коли з картки користувача була списана сума,
що перевищує зазначену в чеку.
Крім цього, відомий блогер OH MY GADGET у своєму відео показав
проблеми у секції «Найпопулярніше у Вашому місці» на головній сторінці сайту
«Glovo».
При натисканні на деякі магазини відображалася сторінка з помилкою, але,
якщо ввести назву цього магазину у пошуковому рядку, то меню магазину коректно
відображалося.
Варто зауважити, що ці проблеми відносяться тільки до веб-версії сайту,
оскільки в мобільному додатку такі проблеми не спостерігалися. Крім того, блогеру
не було зрозуміло, що секція замовлення в додатку розміщена внизу екрану у
вигляді логотипу «Glovo».
16
Рисунок 1.1 – Головна сторінка Рисунок 1.2 – Загальний вигляд
сервісу «Glovo» секції «Найпопулярніше» сервісу
«Glovo»
Недоліки сервісу «Glovo»:
Деякі користувачі скаржаться на нестабільність програми та вильоти.
Інтерфейс програми не завжди зручний для користувачів.
Деякі замовлення можуть бути дорогими через високу комісію та інші збори.
Переваги сервісу «Glovo»:
Великий вибір ресторанів та магазинів для замовлення їжі та інших товарів.
Швидка доставка.
Зручний інтерфейс програми з можливістю відстеження замовлення.
Можливість спілкування з кур'єром та відправлення зворотного зв'язку.
17
1.2.2 Аналіз сервісу «Raketa». Другим в роботі проаналізовано сервіс
«Raketa». Головна сторінка сервісу «Raketa» представлена на рис. 1.3.
Рисунок 1.3 – Головна сторінка сервісу «Raketa»
Сервіс «Raketa» з'явився на ринку після «Glovo» та «UberEats». Щоб
привернути увагу клієнтів, вони заявили: «доставка буде безкоштовною завжди».
Звісно, ставиться під сумнів така заява, адже замовники мають сплачувати
додаткову комісію кур'єрам за кожне замовлення, що буде додатковими витратами
для них.
Недоліки сервісу «Raketa»:
Деякі користувачі скаржаться на обмежений вибір ресторанів та страв.
Деякі замовлення можуть бути затримані через збоїв у системі або відсутність
ресторанів.
Деякі користувачі нарікають на неякісний сервіс підтримки клієнтів.
Відсутність фільтру по кухням, а саме: доводиться гортати всі заклади зі
списку (рис. 1.4);
Не всі страви супроводжуються фотографією;
18
Потрібно оновлювати сторінку зі статусом замовлення вручну, в той час як в
«UberEats» та «Glovo» цей процес відбувається автоматично. Крім того,
відсутня можливість оцінити роботу кур'єра та залишити відгук про ресторан.
Рисунок 1.4 – Перегляд ресторанів у мобільному додатку «Raketa»
Переваги сервісу «Raketa»:
Великий вибір ресторанів та магазинів для замовлення їжі та інших товарів.
Швидка доставка.
Зручний інтерфейс програми з можливістю відстеження замовлення.
Можливість спілкування з кур'єром та відправлення зворотного зв'язку.
У кваліфікаційній роботі бакалавра при розробці мобільного додатку для
замовлення продуктів харчування варто реалізовувати замовлення, враховуючи
оплату за доставку.
1.2.3. Аналіз сервісу «UberEats». Наступним в роботі проаналізовано сервіс
«UberEats». Проаналізувавши даний сервіс, варто зазначити, що він обмежений:
заплатити можна тільки карткою; можна замовити тільки через додаток.
Головна сторінка сервісу «UberEats» представлена на рис. 1.5.
19
Рисунок 1.5 – Головна сторінка сервісу UberEats
Недоліки сервісу «UberEats»:
Висока комісія за доставку може зробити деякі замовлення надто дорогими.
Деякі користувачі скаржаться на помилки, які можуть призвести до затримки
доставки.
Деякі замовлення можуть бути затримані через пробки на дорогах.
Переваги сервісу «UberEats»:
Великий вибір ресторанів та магазинів для замовлення їжі та інших товарів.
Швидка доставка.
Зручний інтерфейс програми з можливістю відстеження замовлення.
Можливість спілкування з кур'єром та відправлення зворотного зв'язку.
1.2.4. Аналіз сервісу «BoltFood». Також в кваліфікаційні роботі бакалавра
проаналізовано сервіс «BoltFood». Головна сторінка сайту «BoltFood» представлена
на рис. 1.6.
20
Рисунок 1.6 – Головна сторінка сервісу «BoltFood»
«BoltFood» доступний у кількох країнах по всьому світу, включаючи Південну
Африку, Естонію, Кенію та інші. Він пропонує широкий вибір ресторанів та страв, а
також швидку доставку. «BoltFood» також дозволяє користувачам відстежувати
статус доставки та відправляти зворотний зв'язок.
Недоліки сервісу «BoltFood»:
У деяких містах BoltFood може бути недоступним або обмежені пропозиції.
Деякі користувачі скаржаться на високу комісію за доставку, що може робити
замовлення дорогими.
Можливі затримки в доставці через пробки на дорогах або інших факторів.
Переваги сервісу «BoltFood»:
Великий вибір ресторанів та страв для замовлення.
Швидка доставка.
Зручний інтерфейс програми з можливістю відстеження замовлення.
Можливість відправлення зворотного зв'язку.
21
1.3 Аналіз порівнянь існуючих рішень розглянутих реалізацій та
постановка завдання
Проаналізувавши існуючі рішення розглянутих реалізацій, в кваліфікаційній
роботі бакалавра є кілька пропозицій щодо усунення обмежень існуючих сервісів:
1. Для категорії продуктів харчування варто ввести поле, де можна вказати
вартість за кілограм, упаковку або штуку.
2. Завжди треба уникати створення розділу «Найпопулярніше» у сервісі,
оскільки це може порушити пошук магазинів у місцевості, де знаходиться
користувач.
3. Потрібно додати фільтри пошуку для поліпшення користувацького досвіду.
4. Варто зробити поле "Фото страви" обов'язковим для заповнення.
5. Кнопка переходу до перегляду власного замовлення у користувача повинна
мати вигляд, що асоціюється з самим замовленням.
У таблиці 1.1 представлено порівняльний аналіз розглянутих сервісів для
замовлення продуктів харчування, а саме: «Glovo», «Raketa», «UberEats»,
«BoltFood».
Таблиця 1.1 – Таблиця порівнянь існуючих рішень розглянутих реалізацій
Критерії Назва сервісу
порівняння
«Glovo» «Raketa» «UberEats» «BoltFood»
сервісів
Дизайн
4 4 5 3
(0-5)
Швидкість
завантаження 4 3 4 2
(0-5)
Швидкість
обробки 3 4 3 4
замовлення
Вартість доставки
4 3 2 3
замовлення
22
Як видно із табл. 1.1, що у якості критеріїв для порівняння було обрано:
дизайн; швидкість завантаження; швидкість обробки замовлення; ціна доставки
замовлення.
Підсумовуючи перегляд та оцінку приведених вище сервісів, варто зазначити,
що кожному з них притаманні такі характеристики:
− Зрозумілий дизайн;
− Дуже швидка обробка замовлень;
− Приємна вартість за доставку.
Проаналізувавши існуючі рішення розглянутих реалізацій, в кваліфікаційній
роботі бакалавра при розробці мобільного додатку для замовлення продуктів
харчування варто звернути увагу на такі моменти:
− додаток повинен мати зручний, зрозумілий та приємний інтерфейс;
− додаток повинен мати швидкість завантаження серед оцінок (0-5), а саме: 4;
− додаток повинен мати швидку обробку замовлення;
− ціна доставки замовлення має бути не високою.
Постановка завдання
1. Аналіз бізнес-логіки роботи, функціональних вимог та використаних засобів
користувацьких інтерфейсів існуючих додатків доставки замовлень.
2. Дослідження та вибір найактуальніших технологій мобільної розробки для
створення сучасних мобільних додатків.
3. Розробка мобільного додатку для замовлення продуктів харчування, що
задовольняє таким функціональним вимогам:
− автентифікація та реєстрація користувачів;
− перегляд товарів за категоріями;
− перегляд продуктів харчування;
− додавання контактної інформації до свого профілю;
− додавання продуктів харчування до кошика та оформлення замовлення;
− завантажувати продукти харчування та змінювати їх (для адміністратора);
− переглядати інформацію про користувача та його замовлення.
23
Висновки до розділу 1
В даному розділі досліджено предметну область, а саме: замовлення продуктів
харчування через мобільні пристрої; основні проблеми створення мобільних
додатків для замовлення продуктів; огляд аналогів для замовлення продуктів
харчування.
Виконано порівняльний аналіз існуючих мобільних додатків для замовлення
продуктів харчування: «Glovo», «Raketa», «BoltFood», «UbetEats».
Представлено таблицю порівнянь існуючих рішень розглянутих реалізацій та
визначено постановку завдання.
24
2 ПРОЕКТУВАННЯ МОБІЛЬНОГО ДОДАТКУ ДЛЯ ЗАМОВЛЕННЯ
ПРОДУКТІВ ХАРЧУВАННЯ «FAST DELIVERY»
2.1 Опис функціонального програмного середовища для розробки
Розглянемо детальніше програмне середовище та його особливості для
розробки мобільного додатку «Fast delivery».
Android Studio – інтегроване середовище розробки виробництва Google, за
допомогою якого розробникам стають доступні інструменти для створення програм
на платформі Android OS. Android Studio можна встановити на Windows, Mac та
Linux. Android Studio створене з урахуванням IntelliJ IDEA [3].
Studio – це інтегроване середовище розробки (IDE), яке надає інструменти для
створення ПЗ для смартфонів, планшетів та інших пристроїв на базі Android. Воно
також має нові технологічні рішення для Android TV, Android Wear, Android Auto,
Glass і додаткових контекстуальних модулів [3].
Android Studio розроблене для команд розробників різного розміру – від
невеликих груп або навіть одиничних розробників мобільних додатків до великих
міжнародних організацій, що використовують системи керування версіями, такі як
GIT [3, 6]. Досвідчені розробники можуть вибрати найбільш підходящі інструменти
для масштабних проектів. Розробка рішень для Android відбувається в Android
Studio з використанням мов програмування Java або C++.
Основою робочого процесу Android Studio є концепція безперервної
інтеграції, що дозволяє виявляти проблеми в реальному часі [6]. Це забезпечує
тривалу перевірку коду і дозволяє розробникам ефективно спілкуватися та
отримувати зворотний зв'язок. Такий підхід допомагає прискорити процес
публікації мобільного додатку в Google Play App Store. Крім цього, він надає
підтримку інструментів LINT, Pro-Guard і App Signing, що сприяють вдосконаленню
якості та безпеки програмного забезпечення. За допомогою засобів оцінки
продуктивності визначається стан файлу з пакетом прикладних програм.
25
Візуалізація графіки дає змогу дізнатися, чи програма відповідає орієнтиру Google в
16 мілісекунд.
За допомогою інструменту для візуалізації пам'яті розробник дізнається, коли
його додаток буде використовувати занадто багато оперативної пам'яті та коли
відбудеться складання сміття.
Інструменти для аналізу батареї показують, яке навантаження лягає на
пристрій.
Android Studio сумісна з платформою Google App Engine для швидкої
інтеграції у хмари нових API та функцій. У розробці є різні API, такі як Google Play,
Android Pay і Health. Є підтримка всіх платформ Android, починаючи з Android 1.6.
Особливості Android Studio [6].
Нові функції відображаються з кожною новою версією Android Studio. На
даний момент доступні такі функції:
− Розширений редактор макетів: WYSIWYG, здатність працювати з UI
компонентами за допомогою Drag-and-Drop, функція попереднього перегляду
макета на декількох конфігураціях екрану.
− Складання додатків, засноване на Gradle.
− Різні види збірок та генерація декількох .apk файлів.
− Рефакторинг коду.
− Статичний аналізатор коду (Lint), що дозволяє знаходити проблеми
продуктивності, несумісності версій та інше.
− Вбудований ProGuard та утиліта для підписування додатків.
− Шаблони основних макетів та компонентів Android.
− Підтримка розробки додатків для Android Wear та Android TV.
− Вбудована підтримка Google Cloud Platform, яка включає інтеграцію з
сервісами Google Cloud Messaging і App Engine.
− Android Studio 2.1 підтримує Android Preview SDK, а це означає, що
розробники зможуть розпочати роботу зі створення програми для нової
програмної платформи.
26
− Нова версія Android Studio 2.1 здатна працювати з оновленим компілятором
Jack, а також має покращену підтримку Java 8 та вдосконалену функцію
Instant Run.
− Починаючи з Platform-tools 23.1.0 для Linux винятково 64-розрядна.
− В Android Studio 3.0 будуть за стандартом включені інструменти мови Kotlin,
засновані на JetBrains IDE [6].
Java – це високорівнева, об'єктно-орієнтована мова програмування на основі
класів, яка розроблена з якомога меншою залежністю реалізації [7]. Це мова
програмування загального призначення, призначена для того, щоб розробники
програм могли писати один раз, а запускати їх де завгодно (WORA – Write Once,
Run Anywhere), що означає, що скомпільований код Java може працювати на всіх
платформах, що підтримують Java, без необхідності перекомпіляції.
Програми Java, зазвичай, компілюються в байт-код, який може працювати на
будь-якій віртуальній машині Java, незалежно від базової архітектури комп'ютера.
Синтаксис Java подібний до C та C ++, але має менше засобів низького рівня, ніж
будь-який з них. Час виконання Java забезпечує динамічні можливості (наприклад,
відображення та модифікацію коду середовища виконання), які, як правило,
недоступні в традиційних компільованих мовах [7].
Зразу Java була розроблена Джеймсом Гослінгом у Sun Microsystems, потім
була придбана Oracle та випущена в 1995 році як основний компонент Java-
платформи Sun Microsystems. Оригінальні та довідкові реалізатори Javaкомпілятори,
віртуальні машини та бібліотеки класів були спочатку випущені Sun під власними
ліцензіями.
Станом на травень 2007 року, згідно з вимогами процесу спільноти Java, Sun
здійснила ліцензію на більшість своїх технологій Java під загальною публічною
ліцензією GNU. Oracle пропонує власну віртуальну машину HotSpot Java, однак
офіційним посиланням є OpenJDK JVM, яке є безкоштовним програмним
забезпеченням з відкритим кодом і використовується більшістю розробників і є JVM
за замовчуванням для майже всіх дистрибутивів Linux.
27
Станом на березень 2021 року останньою версією є Java 16, з Java 11, яка
наразі підтримується довгостроковою підтримкою (LTS), випущена 25 вересня 2018
року. Варто зауважити, що Oracle випустила останнє публічне оновлення із
застарілою версією Java 8 LTS у січні 2019 року для комерційного використання,
хоча в іншому випадку він все ще підтримуватиме Java 8 із загальнодоступними
оновленнями для особистого користування на невизначений час. Інші
постачальники почали пропонувати збірки OpenJDK 8 та 11 з низькою вартістю, які
все ще отримують оновлення безпеки та інші оновлення [7].
У створенні мови Java було п’ять основних цілей [7]:
− синтаксис має бути простим, об’єктно-орієнтованим та звичним;
− мова повинна бути надійним і надійним;
− Java має бути нейтральною до архітектури та портативною;
− присутня висока продуктивність;
− мова повинна бути інтерпретованим, різьбовим та динамічним.
Однією з цілей дизайну Java є портативність, що означає, що програми,
написані для платформи Java, повинні працювати аналогічно на будь-якій комбінації
обладнання та операційної системи з адекватною підтримкою часу роботи. Це
досягається компіляцією коду мови Java до проміжного подання, що називається
байт-кодом Java, замість безпосередньо до специфічного для архітектури
машинного коду. Інструкції байт-коду Java аналогічні машинному коду, але вони
призначені для виконання віртуальною машиною, написаною спеціально для
апаратного забезпечення хоста. Кінцеві користувачі зазвичай використовують
середовище виконання Java, встановлене на їх машині для окремих програм Java або
у веб-браузері для аплетів Java.
Стандартні бібліотеки забезпечують загальний спосіб доступу до
особливостей хоста, таких як графіка, створення потоків та створення мереж.
Використання універсального байт-коду спрощує перенесення. Однак, накладні
витрати на інтерпретацію байт-коду в машинних інструкціях робили інтерпретовані
програми майже завжди більш повільними, ніж власні виконувані файли.
28
Компілятори, які компілюють байт-коди до машинного коду під час виконання,
були введені з ранньої стадії.
Сама Java не залежить від платформи і пристосована до конкретної
платформи, на якій вона повинна працювати віртуальною машиною Java для неї, яка
переводить байт-код Java на машинну мову платформи. Критика, спрямована на
Java, включає реалізацію дженериків, швидкість, обробку непідписаних чисел,
реалізацію арифметики з плаваючою крапкою, та історію вразливих місць безпеки у
первинній реалізації JVM HotSpot.
Мова Java є ключовою опорою в Android, мобільній операційній системі з
відкритим кодом. Хоча Android, побудований на ядрі Linux, написаний переважно
на мові C, Android SDK використовує мову Java як основу для програм для Android,
але не використовує жодного зі своїх стандартних графічних інтерфейсів, SE, ME
або інших встановлених стандартів Java. Мова байт-коду, що підтримується Android
SDK, несумісна з байт-кодом Java і працює на власній віртуальній машині,
оптимізованій для пристроїв з малою пам’яттю, таких як смартфони та планшетні
комп’ютери. Залежно від версії Android, байт-код інтерпретується віртуальною
машиною Dalvik або компілюється в рідний код робочою системою Android.
Ключовий компонент життєвого циклу програми є Activity [7].
Схематично взаємозв’язок між усіма викликами можливо показати так, як на
рисунку 2.1. Діяльність у системі управляється як стеки дій. Коли починається нова
діяльність, вона зазвичай розміщується у верхній частині поточного стеку і стає
поточним – попередня діяльність завжди залишається під нею у стеку і знову не
вийде на передній план, поки не вийде нова. На екрані може бути видно один або
кілька стеків діяльності.
Діяльність, по суті, має чотири стани:
− якщо діяльність знаходиться на передньому плані екрана, то вона активна або
запущена, зазвичай це діяльність, з якою користувач зараз взаємодіє;
− якщо дія втратила фокус, але все ще представлена користувачеві, це візуально
помітно. Це можливо, якщо нова не повнорозмірна або прозора діяльність
фокусується на вашій діяльності, інша діяльність займає вищу позицію в режимі
29
багато вікон, або сама діяльність не може бути сфокусованою у поточному режимі
вікон. Така діяльність повністю жива (вона зберігає всю інформацію про стан та
членів і залишається прикріпленою до менеджера вікон);
Рисунок 2.1 – Життєвий цикл Activity
− якщо діяльність повністю закрита іншою, вона зупиняється або приховується.
Він як і раніше зберігає всю інформацію про стан та членів, однак користувачеві
більше не видно, тому його вікно приховано, і система часто його знищує, коли
потрібна пам’ять в іншому місці;
− система може скинути діяльність з пам'яті, попросивши її закінчити, або
просто знищивши її процес, зробивши його знищеним. Коли він знову
30
відображається користувачеві, його слід повністю перезапустити та відновити до
попереднього стану.
onCreate() викликається, коли дія створюється вперше. Тут слід виконувати всі
свої звичайні статичні налаштування: створювати подання, прив’язувати дані до
списків тощо. Цей метод також надає вам Bundle, що містить попередньо
заморожений стан діяльності, якщо такий був. Завжди слідує onStart().
onRestart() викликається після припинення діяльності перед її повторним
запуском. Завжди слідує onStart().
onStart() викликається, коли діяльність стає видимою для користувача. Слідом
за onResume(), якщо діяльність виходить на перший план, або onStop (), якщо вона
стає прихованою.
onResume() викликається, коли дія почне взаємодіяти з користувачем. На цей
момент ваша активність знаходиться у верхній частині стеку своїх активностей, і в
неї вводиться введення користувачем. Завжди слідує onPause().
onPause() викликається, коли дія втрачає стан переднього плану, більше не
фокусується або перед переходом у зупинений або знищений стан. Діяльність все
ще видна користувачеві, тому рекомендується залишати її візуально активною та
продовжувати оновлювати інтерфейс. Впровадження цього методу повинно бути
дуже швидким, оскільки наступна дія не буде відновлена, поки цей метод не
повернеться. Слідує або onResume(), якщо дія повертається назад, або onStop(),
якщо стає невидимою для користувача.
onStop() викликається, коли діяльність більше не відображається
користувачеві. Це може статися або через те, що починається нова діяльність зверху,
перед цією висувається існуюча, або ця руйнується. Зазвичай це використовується
для зупинки анімації та оновлення інтерфейсу тощо. Слідом або onRestart(), якщо ця
активність повертається для взаємодії з користувачем, або onDestroy(), якщо ця
активність припиняється.
onDestroy() отримується до того, як діяльність буде знищена. Це може статися
або через те, що діяльність закінчується, або тому, що система тимчасово знищує
цей екземпляр діяльності, щоб заощадити місце.
31
Якщо конфігурація пристрою (як визначено класом Resources.Configuration)
змінюється, то все, що відображає користувальницький інтерфейс, потрібно буде
оновити, щоб відповідати цій конфігурації. Оскільки Activity є основним
механізмом взаємодії з користувачем, він включає спеціальну підтримку для
обробки змін конфігурації.
Якщо не вказано інше, зміна конфігурації (наприклад, зміна орієнтації екрана,
мови, пристроїв введення тощо) призведе до знищення поточної активності,
проходячи звичайний процес життєвого циклу onPause(), onStop() та onDestroy()
відповідно. Якщо діяльність була на передньому плані або видима користувачеві,
після того, як у цьому екземплярі буде викликано onDestroy(), буде створено новий
екземпляр активності з будь-яким збереженим InstanceState, попереднім
екземпляром, згенерованим з onSaveInstanceState (Bundle).
Це робиться тому, що будь-який ресурс програми, включаючи файли макета,
може змінюватися залежно від будь-якого значення конфігурації. Таким чином,
єдиним безпечним способом обробки зміни конфігурації є повторне отримання всіх
ресурсів, включаючи макети, малюнки та рядки. Оскільки дії вже повинні знати, як
зберегти свій стан і відтворити себе з цього стану, це зручний спосіб перезапустити
діяльність з новою конфігурацією. Перехід між станами activity представлено на
рисунку 2.2.
Рисунок 2.2 – Перехід між станами
32
2.2 Основні принципи розробки мобільних додатків
Розробка мобільних додатків базується на декількох основних принципах, що
допомагають створити ефективний та зручний продукт для користувачів.
Основні принципи розробки мобільних додатків включають:
Визначення цілей та аудиторії: перш, ніж розпочати розробку додатку,
важливо чітко визначити його цілі та аудиторію, до якої він призначений. Це
допоможе зорієнтуватися при виборі функціональності, дизайну та інтерфейсу
додатку.
Дизайн інтерфейсу користувача (UI/UX): грамотний дизайн інтерфейсу
користувача допомагає забезпечити зручність та естетичність додатку. Він повинен
бути інтуїтивно зрозумілим, легким у використанні та відповідати принципам UX-
дизайну для створення позитивного користувацького досвіду.
Мобільна платформа: вибір мобільної платформи (Android, iOS, Windows)
впливає на технологічні аспекти розробки. Кожна платформа має свої особливості
та вимоги до розробки додатків, тому слід враховувати цей фактор при виборі
платформи.
Функціональність: додаток повинен мати необхідний функціонал для
досягнення своїх цілей. Варто уникати перевантаження додатку зайвими функціями,
проте враховувати потреби користувачів і надавати їм необхідний набір функцій.
Безпека: забезпечення безпеки даних користувачів є важливою складовою
розробки мобільних додатків. Потрібно розробити механізми шифрувань.
2.3 Архітектура мобільних додатків
Архітектура програм на платформі Android базується на ідеї використання
компонентів – основних блоків для побудови додатків. Операційна система Android
розроблена таким чином, що дозволяє будь-якій програмі запускати компоненти
інших програм. Коли система запускає компонент, вона створює процес для
програми, якій він належить, і необхідні екземпляри класів. Це означає, що в
Android немає єдиної точки входу, оскільки кожна програма працює у власному
33
процесі і має обмежений доступ до файлів. Програма не може прямо активувати
компонент іншої програми. Замість цього для активації компонента потрібно
надіслати системі повідомлення про намір запустити конкретний компонент, і
система сама його запустить [1].
Загалом, Android-програма [8] складається з:
– Java-класів, які є підкласами основного класу із Android SDK (View, Activity,
ContentProvider, Service, BroadcastReciever, Intent) та Java-класів, в яких немає
батьківських в Android SDK.
– Маніфесту програми, ресурсів (рядків, зображень і т.д.) та файлів. Основні
компоненти програм для Android.
Основні компоненти для Android представлено на рис. 2.3.
Рисунок 2.3 – Основні компоненти для Android
Activity – це візуальна складова програми, що представляє собою екран
інтерфейсу користувача. Вона реалізується за допомогою класу Activity та має свою
розмітку, описану в XML-файлі. У програмі на Android можуть бути декілька
Activity, між якими можна перемикатися під час роботи. Наприклад, якщо програма
призначена для соціальної мереж. Перша Activity може відображати профіль
користувача, друга – список друзів, третя – повідомлення. Незважаючи на те, що для
користувача програма є єдиною, всі Activity не залежать одна від одної. Тому будь-
яку з них можна запустити з іншої програми, яка має доступ до Activity даної
програми. Наприклад, програма камери може запустити Activity, що відображає
список друзів користувача, для надсилання фотографії комусь із них [1].
34
Activity також має свій життєвий цикл, на протязі якого вона знаходиться в
одному із трьох станів:
1. Активно і виконується – коли інтерфейс користувача знаходиться на
передньому плані, видимий і має фокус. Код програми виконується тільки при
таких умовах.
2. Призупинено – коли інтерфейс користувача втратив фокус, але все ще
видимий. В такому стані код не виконується.
3. Завершено – коли інтерфейс користувача невидимий. Як і в призупиненому
стані, код не виконується. Немає гарантій, що об’єкт Activity та пов’язані з
ним інші об’єкти знаходяться в пам’яті, коли Activity знаходиться в цьому
стані або в призупиненому.
Services – це служби, фонові компоненти, які виконують різні завдання. Вони
не мають інтерфейсу користувача, але можуть повідомляти користувача через
систему повідомлень Android. Основна відмінність сервісів від Activity полягає в
тому, що вони можуть працювати в фоновому режимі, незалежно від того, чи
знаходиться їхній інтерфейс на передньому плані. Наприклад, сервіс може
відтворювати музику у фоновому режимі, поки користувач використовує іншу
програму. Сервіс може бути запущений іншим компонентом, таким як Activity, і
після цього він може працювати автономно або зв'язаним з цим компонентом,
взаємодіючи з ним [1].
Content Providers (контент-провайдери) використовуються для керування
даними в програмі. Ці дані можуть бути збережені в базі даних SQLite, файловій
системі, мережі або будь-якому іншому доступному для програми місці збереження.
Контент-провайдер дозволяє іншим програмам, за умови наявності відповідних
дозволів, виконувати запити на читання або зміну даних. У системі Android існує
контент-провайдер, який керує інформацією про контакти користувача. Тому будь-
яка програма, яка має права доступу до цих даних, може зробити запит на читання
або запис інформації про певний контакт. Контент-провайдер також може
використовуватися для читання і запису приватних даних програми, які не
призначені для доступу ззовні [1].
35
Приймач широкомовних сповіщень (Broadcast Receiver) – це компонент, який
отримує та обробляє широкомовні сповіщення. Ці сповіщення зазвичай генеруються
самою системою, наприклад, повідомлення про вимкнений екран або низький рівень
заряду акумулятора. Широкомовні сповіщення також можуть бути створені
програмами, наприклад, коли програма поширює повідомлення про завантаження
даних, доступних для використання іншим програмам. Хоча приймач не має
власного інтерфейсу, він може створювати сповіщення на панелі стану, щоб
повідомити користувача про наявність широкомовного сповіщення. Приймачі
виступають посередниками до інших компонентів та виконують невеликий обсяг
роботи, наприклад, запускають відповідний сервіс або подію. Програма може
зареєструвати себе як приймач для певних подій та бути автоматично запущеною,
якщо така подія виникає [1].
Intent-клас – це клас, об'єкти якого використовуються для передачі
повідомлень, що називаються намірами (Intents), між основними компонентами
програми. Наміри – це асинхронні повідомлення, які дозволяють програмі
запитувати функції з інших служб або подій. Програма може зробити прямі запити
до служби або дії, або запитати зареєстровані в Android служби та програми.
Екземпляр класу Intent є структурою даних, що містить опис операції, яка повинна
бути виконана, і зазвичай використовується для запуску Activity або сервісу. У
випадку з приймачами, цей об'єкт містить опис події, яка відбулася або була
оголошена. Система Android, у відповідь на намір, знаходить відповідний
компонент: Activity, Service або Broadcast Receiver, та запускає його, якщо це
необхідно. Повідомлення-намір, яке відправлено певному компоненту, буде
отримано лише цим компонентом. Наприклад, коли одна Activity запускає іншу,
вона створює намір з описом дії та передає його в метод startActivity(). Потім
система Android перевіряє всі програми на відповідність наміру, знаходить потрібну
та запускає відповідну Activity, викликаючи метод onCreate() і передаючи в нього
об'єкт-намір Intent (рис. 2.4). Таким чином, програма може запросити, наприклад,
програму «Контакти» для отримання даних або запустити браузер при натисканні
посилання в програмі.
36
Рисунок 2.4 – Діаграма переходу від одного Activity до іншого
View – це клас, який виступає в ролі будівельного блоку для компонентів
інтерфейсу користувача. Він визначає прямокутну область екрану і відповідає за
відображення та обробку подій. View є базовим класом для віджетів, таких як
кнопки, прапорці, текстові поля та інші. Він також є базовим класом для класу
ViewGroup, який є невидимим контейнером для інших контейнерів та віджетів.
ViewGroup визначає властивості розташування компонентів інтерфейсу користувача
(рис. 2.5). Інтерфейс програми Android складається з ієрархії цих компонентів, і його
розмітка зазвичай визначається за допомогою XML-файлу. Під час виконання
програми, XML-розмітка автоматично перетворюється в дерево відповідних об'єктів
для правильного відображення і взаємодії з користувачем [1].
Рисунок 2.5 – Ієрархія інтерфейсу
Маніфест Android – це XML-файл, який є важливою складовою Android-
програми і виконує кілька функцій:
37
– Визначає ім'я Java-пакету програми, яке є унікальним ідентифікатором для
програми.
– Описує компоненти програми, такі як Activity, Services, Broadcast Receivers та
Content Providers. Він визначає назви класів, що реалізують кожен з цих
компонентів, і оголошує їх можливості, наприклад, які Intent-повідомлення
вони можуть обробляти. Ці оголошення дозволяють операційній системі
Android знати, які компоненти можуть бути запущені за певних умов.
– Визначає процеси, в яких будуть розташовані компоненти програми.
– Оголошує дозволи, необхідні для доступу до компонентів програми.
– Оголошує дозволи, які програма повинна мати для доступу до захищених
частин API та взаємодії з іншими програмами.
– Вказує мінімальний рівень API, який потребує програма.
– Перераховує бібліотеки, з якими програма повинна бути пов'язана.
Android-програми використовують ресурси, такі як зображення, шари
графічного інтерфейсу користувача, оголошення меню у вигляді XML-файлів та
текстові рядки [5]. Ці ресурси ідентифікуються за допомогою рядків, які можуть
містити, наприклад, шлях та назву файлу, що містить зображення. Під час
проектування Android-програми створюється спеціальний Java-клас з назвою R,
який містить статичні фінальні набори даних. Кожен набір представляє собою
посилання на окремий ресурс, який використовується в коді програми для зв'язку з
ресурсами. Це допомагає виявити помилки в посиланні на ресурс під час компіляції,
наприклад, якщо розробник вказав посилання на неіснуючий ресурс або допустив
помилку в ньому. Android-програми використовують різні типи файлів, такі як
загальні файли, бази даних, кешовані файли та файли Opaque Binary Blob (файли з
зашифрованою файловою системою, яку можна змонтовувати для програми).
Узагальнюючи вищесказане, можна зробити висновок, що маніфест Android є
важливим XML-файлом, який визначає параметри програми, описує її компоненти,
дозволи, вимоги до API та ресурси, що використовуються. Він є необхідним для
правильного функціонування та взаємодії програми з операційною системою
Android [1].
38
2.4 Розробка діаграми варіантів використання
Діаграма варіантів використання (Use Case Diagram) є важливим елементом
при плануванні проекту, оскільки вона просто демонструє взаємодію між акторами
та прецедентами. Це найпростіша форма поведінкової діаграми. Створення такої
діаграми надає інформацію про функціонал майбутньої системи та показує, як
актори можуть взаємодіяти з цією системою.
Один з акторів, що використовується при створенні діаграми, це «User
Customer» – це особа, яка вибирає певну систему та має намір взаємодіяти з нею.
Після вибору всіх потенційних користувачів системи формується перелік можливих
варіантів взаємодії з цією системою.
В кваліфікаційній роботі бакалавра розроблена діаграма Use Case на основі
інформації про користувачів додатку, а також можливих варіантів взаємодії з ним.
На діаграмі представлено три типи юзерів: темно зеленим кольором визначаються
загальні дії, а решта – відповідно до кольору кожного юзера.
Варіанти використання мобільного додатку наступні:
− Реєстрація.
− Авторизація.
− Перегляд замовлень.
− Перегляд історії замовлень.
− Розміщення свого товару.
− Робити замовлення продуктів харчування.
− Додавати в улюблене.
− Підтримка додатку.
− Підтримка юзерів.
− Налаштування профілю в особистому кабінеті.
На основі сформованих даних про акторів та всі можливі варіанти
використання мобільного додатку, отримали Use Case діаграму (рис. 2.6).
39
Рисунок 2.6 – Діаграма варіантів використання Use Case
2.5 Проектування структури бази даних
Проектування структури бази даних є важливою складовою розробки
програмного забезпечення. Ефективна структура бази даних забезпечує ефективне
зберігання, доступ і оновлення даних. Розглянемо кілька ключових кроків
проектування структури бази даних.
Розуміння потреб бізнесу та вимог до даних є першим кроком. Потрібно
встановити, які дані необхідні, як вони пов'язані між собою і як вони будуть
використовуватися. Сутності визначаються як основні об'єкти, для яких будуть
зберігатися дані. Наприклад, якщо створюємо базу даних для онлайн-магазину,
сутностями можуть бути «користувач», «продукт», «замовлення» і т. д.
Кожна сутність має свої атрибути, які описують властивості цих сутностей.
Наприклад, для сутності «користувач» атрибутами можуть бути «ім'я», «прізвище»,
«адреса електронної пошти» і т. д.
40
Визначення взаємозв'язків між сутностями є важливим аспектом проектування
бази даних. Відношення можуть бути один-до-одного, один-до-багатьох або багато-
до-багатьох. Наприклад, замовлення можуть мати відношення один-до-багатьох з
продуктами, оскільки одне замовлення може містити багато продуктів.
Нормалізація є процесом оптимізації структури бази даних шляхом розбиття
даних на менші та більш узгоджені таблиці. Це допомагає уникнути аномалій даних.
Під час проектування структури бази даних важливо вибрати відповідні типи
даних для кожного атрибуту. Наприклад, цілочисельні дані можуть бути
представлені типом INTEGER, а текстові дані – типом VARCHAR. Також можна
встановити обмеження на значення атрибутів, наприклад, обов'язкове поле або
обмеження унікальності. На основі визначених сутностей, атрибутів та відношень
створюються таблиці бази даних. Кожна таблиця представляє сутність, а кожен
атрибут стає стовпчиком. Зв'язки між таблицями встановлюються за допомогою
зовнішніх ключів.
Для поліпшення продуктивності запитів до бази даних можна створити
індекси. Індекси допомагають швидко знаходити дані за певними стовпчиками і
прискорюють операції пошуку. Важливо забезпечити цілісність даних в базі даних.
Це включає в себе встановлення правил перевірки даних, обмежень цілісності та
використання транзакцій для збереження консистентності даних.
Після створення структури бази даних важливо оптимізувати запити, які
будуть виконуватися до бази даних. Це може включати створення відповідних
запитів, використання індексів і переглядів для підвищення продуктивності.
Для створення backend частини в кваліфікаційній роботі бакалавра обрано
базу даних Firebase.
Firebase – це платформа для розробки мобільних та веб-додатків, яка надає
широкий спектр інструментів та сервісів для розробників. Основні характеристики
Firebase включають:
База даних в реальному часі: Firebase надає реальний час синхронізації даних
між клієнтськими додатками і сервером за допомогою Realtime Database. Це
41
дозволяє створювати додатки, які миттєво реагують на зміни даних і спілкуються в
реальному часі.
Аутентифікація та управління користувачами: Firebase має вбудовані сервіси
аутентифікації, які дозволяють легко впровадити функціонал реєстрації та входу
користувачів. Можна використовувати різні методи аутентифікації, такі як:
електронна пошта / пароль, соціальні медіа, номер телефону тощо.
Зберігання файлів: Firebase має сервіс зберігання файлів – Cloud Storage, який
дозволяє зберігати та керувати файлами, такими як зображення, відео, аудіо тощо.
Це забезпечує простий спосіб зберігання медіафайлів для вашого додатку. Firebase
дозволяє розгортати розроблений веб-сайт або веб-додаток за допомогою сервісу
хостингу. Можна легко розмістити власну статичну або динамічну веб-сторінку на
серверах Firebase і отримати безкоштовний SSL-сертифікат. Firebase має сервіс для
створення та розгортання серверної логіки – Cloud Functions. Тому можна
створювати функції, які виконуються на сервері Firebase у відповідь на події в
додатку, такі як збереження даних або виконання певних операцій з даними.
Firebase надає можливість надсилати пуш-сповіщення на мобільні пристрої
користувачів за допомогою сервісу Cloud Messaging. Можна легко налаштувати та
відправляти сповіщення до своїх користувачів з адміністративного інтерфейсу
Firebase. Firebase надає інструменти для збору, аналізу та відстеження даних про
використання власного додатку. При цьому можна отримати інформацію про
активність користувачів, конверсію, ретеншн, аналіз помилок та багато іншого. Це
допомагає вам зрозуміти, як користувачі взаємодіють з вашим додатком і як його
поліпшити. Firebase має інструменти для автоматичного тестування вашого додатку
та здебільшого (сервіс, який допомагає здебільшого автоматично виявляти,
відстежувати та виправляти помилки в програмному забезпеченні). Також можна
автоматизувати тести, перевірити працездатність додатку та отримати звіти про
виявлені проблеми.
В Додатку Г представлено: структуру БД; таблицю продуктів харчування в
БД; таблицю замовлень продуктів харчування в БД; таблицю користувачів у БД.
42
2.6 Опис процесу проектування структури мобільного додатку для
замовлення продуктів харчування
У завдання кваліфікаційної роботи бакалавра, крім опису предметної області
та вибору програмно-технічних засобів, входить реалізація мобільного додатку «Fast
Delivery» з його тестуванням. Щоб представити функціонал мобільного додатку,
потрібно виділити наступні процеси:
− Процес реєстрації користувача в додатку;
− Процес авторизації користувача в додатку;
− Процес використання інформації;
− Процес створення замовлення продуктів харчування.
Процес реєстрації користувача в додатку (рис. 2.7) є одним із найголовніших
процесів. Для реєстрації користувач повинен: ввести дані; перевірити їх на
валідність; зареєструватися.
Рисунок 2.7 – Діаграма процесу реєстрації користувача
Процес авторизації користувача (рис. 2.8) є не менш важливим із процесів
додатку, так як кожен користувач повинен мати свою сторінку, де він може
зберігати свою особисту інформацію.
Для авторизації користувач повинен:
− Ввести дані;
− Перевірити їх валідність;
− Підтвердити авторизацію.
43
Рисунок 2.8 – Діаграма процесу авторизації користувача
Провівши аналіз ресурсів для замовлення продуктів харчування, в
кваліфікаційній роботі бакалавра було обрано структуру мобільного додатку для
замовлення продуктів харчування, що складається з таких розділів:
− Головна сторінка
− Реєстрація користувача;
− Авторизація користувача;
− Каталог товарів;
− Налаштування користувача;
− Перегляд замовлень;
− Оформлення замовлення.
Структура мобільного додатку «Fast Delivery» представлена на рисунку 2.9.
Рисунок 2.9 – Структура мобільного додатку «Fast Delivery»
44
2.7 Проектування інтерфейсу користувача
В рамках кваліфікаційної роботи бакалавра стояло завдання розробити макети
сторінок, які забезпечать зручну, зрозумілу та легку роботу з системою як для
клієнта, так і для адміністратора.
Figma – це популярний веб-сервіс та програма для дизайну і прототипування
інтерфейсів користувача. Вона надає зручні інструменти для створення графічних
елементів, макетів, прототипів та спільної роботи над проектами.
Основні особливості Figma:
Веб-платформа: Figma працює в онлайн-середовищі, що означає, що можна
працювати над проектами з будь-якого комп'ютера, не потребуючи встановлення
додаткового програмного забезпечення.
Векторний редактор: Figma надає потужний векторний редактор, який
дозволяє створювати та редагувати графічні елементи, такі як: іконки, кнопки, фони
та інші.
Компоненти і стилі: Figma дозволяє створювати компоненти, які можна
повторно використовувати в різних частинах проекту. Можна встановлювати стилі
для тексту, кольорів та інших елементів, що полегшує їхнє змінення та
синхронізацію.
Прототипування: За допомогою Figma можна створювати інтерактивні
прототипи, які демонструють поведінку власного дизайну. Можна створювати
переходи між екранами, анімації та додавати взаємодію з елементами.
Спільна робота та командна робота: Figma дозволяє працювати над проектами
спільно з командою. Можна запрошувати співробітників для спільного редагування
проектів в реальному часі, коментувати та залишати відгуки.
Колаборація в реальному часі: Figma дозволяє кільком користувачам
одночасно працювати над одним проектом. Можна бачити зміни, які роблять інші
користувачі, спостерігати за їхніми діями та спілкуватися через чат або коментарі.
45
Версіонування та відстеження змін: Figma автоматично зберігає версії
проекту, що дозволяє вам відстежувати зміни, відкатувати до попередніх версій та
відновлювати попередні стани проекту.
Збереження в хмарі: Всі власні проекти зберігаються в хмарі, що дозволяє
користувачу легко отримувати доступ до них з будь-якого пристрою з
підключенням до Інтернету. Можна також безпечно ділитися проектами з колегами
або клієнтами через посилання.
Плагіни та розширення: Figma підтримує велику кількість плагінів та
розширень, які дозволяють розширити функціональність програми. Можна
використовувати плагіни для автоматизації деяких завдань, експорту ресурсів,
зв'язку з іншими інструментами та багато іншого.
Захист даних: Figma забезпечує високий рівень захисту даних. Всі дані
передаються по зашифрованому з'єднанню, а доступ до проектів може бути
обмежений за допомогою різних рівнів доступу та прав користувачів. Figma є
популярним інструментом серед дизайнерів і розробників завдяки своїй зручності в
роботі, спільній роботі та можливостям прототипування. Вона є відмінним вибором
для команд, які працюють над проектами дизайну інтерфейсу користувача.
Особливо велику популярність Figma здобула завдяки своїй спрощеній спільній
роботі та можливості працювати в реальному часі з різних місць і пристроїв.
Завдяки Figma, команди можуть легко співпрацювати, обговорювати і вносити зміни
в проект одночасно. Це дозволяє ефективно обговорювати ідеї, вносити пропозиції
та швидко реагувати на зміни вимог і вказівок замовника.
Окрім цього, Figma забезпечує зручність управління версіями проекту.
Завдяки автоматичному зберіганню версій, можна легко переглядати попередні
стани проекту, відстежувати зміни та відновлювати попередні версії, якщо потрібно.
Ще одна перевага Figma – це можливість створювати прототипи. Можна
створювати інтерактивні прототипи, які демонструють функціонал і поведінку
власного дизайну. Це дозволяє командам та клієнтам краще зрозуміти, як буде
виглядати та працювати готовий продукт. Крім того, Figma має активну спільноту
користувачів, яка активно ділиться знаннями, плагінами та ресурсами. Можна
46
знайти безліч шаблонів, компонентів і ресурсів, які спростять роботу користувача та
збережуть час. Загалом, Figma – це потужний інструмент для розробки дизайну
інтерфейсу користувача, який забезпечує зручну спільну роботу, можливості
прототипування та ефективне управління проектами.
За допомогою веб-додатку «Figma» були розроблені приблизні макети для
сторінок адмінського та клієнтського інтерфейсу (рис. 2.10–2.11).
Рисунок 2.10 – Інтерфейс сторінок адміна
При розробці панелі адміністратора було надано особливу увагу компактності
подачі інформації та використанню мінімалістичного інтерфейсу. Це робить додаток
зручним для роботи та забезпечує комфортне користування.
При розробці сторінок для користувачів зконцентровано увагу на
компактність подачі інформації, мінімалістичний інтерфейс, що робить додаток
зручним і зрозумілим у використанні. Для цього було створено зрозумілу
реєстрацію користувача та легку авторизацію.
Отже, інтерфейс сторінок користувача доволі легкий та зрозумілий. Тому
користувач з легкістю замовить бажані продукти харчування.
47
Рисунок 2.11 – Інтерфейс сторінок користувача
Висновки до розділу 2
В даному розділі представлено опис функціонального програмного
середовища для розробки мобільного додатку «Fast Delivery», а також досліджено
основні принципи створення мобільних додатків та бази даних.
Була розроблена діаграма Use Case на основі інформації про користувачів
мобільного додатку для замовлення продуктів харчування.
За допомогою веб-додатку Figma був розроблений дизайн мобільного додатку
«Fast Delivery».
Визначено, що використання технології Serverless дозволяє зменшити витрати
на хостинг і збільшити масштабованість додатку.
48
3 ПРОГРАМНА РЕАЛІЗАЦІЯ
3.1 Постановка завдання
Завданням кваліфікаційної роботи бакалавра є написання мобільного додатку
для замовлення продуктів харчування.
Програма буде створена з використанням мови програмування Java для
покращення навиків програмування за допомогою Android Studio. Управління
здійснюватиметься за допомогою камп’ютерної мишки в емуляторі.
Буде розроблено меню з декількома пунктами «Налаштування» для
редагування запису та додавання картинки до профілю. «Вихід» – для того, щоб
вийти із акаунта. Також передбачена «Корзина» для перевірки доданої продукції та
для оформлення замовлення.
Для зручності адміністратору створено екран з вибором категорій для
додавання нових продуктів харчування.
Для запуску програми програмне апаратне забезпечення повинно відповідати
наступним мінімальним вимогам:
− телефон або емулятор з версією API не менше, ніж 26;
− доступ до Інтернету;
− 1 Гб оперативної пам’яті на телефоні.
Основні класи, з яких складається мобільний додаток, зображено на рис 3.1.
Рисунок 3.1 – Класи програми
49
Там представлено класи, які описують функціонал користувачів та
адміністратора. Всі класи розділені на окремі розділи для легкого розуміння згідно
відповідності певного класу.
3.2 Інтерфейс мобільного додатку для замовлення продуктів харчування
У папці layout (рис. 3.2.) знаходяться всі стилі екранів, які створюються у
розробці. Весь інтерфейс програми записується в .xml файли. Для створення
інтерфейсу потрібно імпортувати зображення, які будуть фоном та кнопками. Для
того, щоб імпортувати зображення потрібно їх перемістити у папку проекту
drawable, яка знаходиться в розділі res. З метою відображення на екрані потрібно до
них звертатися у xml-файлах android:srs=”@drawable/назва зображення”.
Рисунок 3.2 – Файли xml
Якщо відкриєми цей файл, то можемо його змінювати через конструктор або
через сам програмний код. Відкривши файл activity_main.xml, з’явиться головне
вікно програми.
3.3 Програмна реалізація мобільного додатку «Fast delivery»
У класі RegisterActivity в методі onDataChange (рис. 3.3) відправвляємо дані з
екрану реєстрації та перевіряємо за номером телефону чи є такий номер телефону в
50
БД. Якщо ж такий номер уже був зареєстрований, то на екрані з'явиться текст, що
номер уже було зареєстровано.
Рисунок 3.3 – Метод onDataChange
Для адміна створено два класи AdminCategoryActivity та
AdminAddNewProductActivity. AdminCategoryActivity описують категорії продукту
та натискання на ці категорії для переходу в клас AdminAddNewProductActivity.
AdminAddNewProductActivity. В цьому класі описуються методи для створення
їх запису в базі Firebase та збереження зображень продуктів. За допомогою методу
SaveProductInfoToDatabase (рис. 3.4) передаємо всі значення продуктів до бази
даних в реальному часі.
Рисунок 3.4 – Метод SaveProductInfoToDatabase
51
Клас HomeActivity – головний клас програми. Він описує створення каталогу
продуктів харчування та додавання їх до корзини, а також виходу із профілю та його
налаштування. Метод downloadAllProducts (рис. 3.5) завантажує всі продукти
харчування з бази даних на телефон користувач або оновлює їх, якщо були певні
зміни.
Рисунок 3.5 – Метод downloadAllProducts
Клас CartActivity описує функціонал кошика для замовлення продуктів
харчування. Головною функцією цього класу є метод sendOrderToFirebase (рис. 3.6).
За допомогою нього передаємо всі дані замовлення та записуємо їх у базі даних
Firebase.
Рисунок 3.6 – Метод sendOrderToFirebase
52
3.4 Особливості тестування мобільного додатку
Тестування мобільного додатку є важливим етапом розробки, який допомагає
виявити помилки, перевірити функціонал та забезпечити якість додатку перед його
випуском.
Особливості тестування мобільного додатку включають наступне [9, 10]:
Платформи: мобільні додатки можуть бути розроблені для різних платформ,
таких, як Android та iOS. Тестування додатку повинно включати перевірку на різних
платформах, оскільки можуть виникати різні проблеми та несумісності.
Різні пристрої: мобільні додатки повинні працювати на різних пристроях з
різними характеристиками (роздільність екрану, версія операційної системи, обсяг
пам'яті та інше). Тестування повинно включати перевірку на різних пристроях, щоб
впевнитися, що додаток працює належним чином.
Розширені можливості пристрою: мобільні пристрої мають різні можливості,
такі, як GPS, камера, акселерометр тощо. Тестування повинно включати перевірку
функціоналу, пов'язаного з цими можливостями, та переконатися, що вони
працюють правильно.
Адаптивний дизайн: мобільні додатки повинні бути адаптивними до різних
розмірів екранів і орієнтацій. Тестування повинно включати перевірку дизайну на
різних пристроях та переконатися, що він відображається належним чином.
Взаємодія зі зовнішніми сервісами: багато мобільних додатків взаємодіють зі
зовнішніми сервісами, такими, як: бази даних, API, платіжні системи тощо.
Тестування різних сценаріїв використання: мобільні додатки мають різні
функціональність та можливості, які повинні бути перевірені на різних сценаріях
використання. Тестування повинно включати перевірку основних функцій додатку,
різних шляхів взаємодії користувача та перевірку правильності обробки даних.
Тестування безпеки: безпека є важливим аспектом мобільних додатків.
Тестування повинно включати перевірку на вразливості, захист персональних даних
користувачів та впевненість у безпечному обміні даними зі зовнішніми сервісами.
53
Тестування реакції на помилки: мобільні додатки повинні вміти відповідати на
непередбачувані ситуації та помилки. Тестування повинно включати перевірку
відповіді додатку на помилкові ситуації, такі, як: втрата зв'язку, некоректні дані,
відмова сервера та інші.
Тестування продуктивності: мобільні додатки повинні працювати швидко та
ефективно. Тестування повинно включати перевірку продуктивності додатку, таку
як: швидкість завантаження, відповідь на запити, ефективне використання ресурсів
пристрою та батареї.
Тестування сумісності: мобільні додатки повинні бути сумісними з різними
версіями операційної системи, апаратними конфігураціями та іншими додатками на
пристрої. Тестування повинно включати перевірку сумісності додатку з різними
конфігураціями та переконатися, що додаток працює належним чином на різних
пристроях та операційних системах.
Тестування реакції на перехід між додатками: в мобільних додатках
користувачі часто переходять з одного додатку в інший, наприклад, з поштового
клієнта в браузер або з соціальної мережі в месенджер. Тестування повинно
включати перевірку, як саме додаток поводиться під час таких переходів, чи
зберігається стан додатку, а також які взаємодії відбуваються з іншими додатками.
Тестування з'єднання з мережею: мобільні додатки часто взаємодіють з
мережами, такими як: Wi-Fi, мобільний інтернет або Bluetooth. Тестування повинно
включати перевірку з'єднання з мережею, стабільності підключення, правильності
передачі даних та переконатися, що додаток працює належним чином у різних
умовах мережі.
Тестування взаємодії зі зовнішніми сервісами: багато мобільних додатків
взаємодіють зі зовнішніми сервісами, такими як: соціальні мережі, платіжні шлюзи,
мапи тощо. Тестування повинно включати перевірку взаємодії з цими сервісами,
правильності передачі даних, авторизації та інтеграції.
Тестування відповідності вимогам та специфікаціям: мобільний додаток має
відповідати вимогам та специфікаціям, що були визначені під час розробки.
54
Тестування повинно перевіряти, чи виконуються всі вимоги, чи відповідає
функціонал заданим специфікаціям та чи працює додаток відповідно до очікувань.
Тестування резервного копіювання та відновлення даних: важливим аспектом
мобільних додатків є забезпечення можливості резервного копіювання та
відновлення даних. Тестування повинно включати перевірку правильності
резервного копіювання даних та їх відновлення, щоб забезпечити захист від втрати
даних та невдалого відновлення.
Тестування локалізації та міжнародного використання: мобільні додатки часто
підтримують різні мови та локалізовані версії для різних регіонів. Тестування
повинно включати перевірку коректності відображення локалізованого тексту,
правильності форматування дат, часу та чисел, а також взаємодії з місцевими
налаштуваннями та регіональними особливостями.
Тестування апаратної відмови та витривалості: мобільні додатки повинні бути
стійкими до апаратних відмов та тривати протягом тривалого часу без витоку
ресурсів. Тестування повинно включати перевірку реакції додатку на низький заряд
батареї, обмеження ресурсів пристрою, велику кількість запущених додатків та інші
сценарії відмови.
3.5 Тестування мобільного додатку «Fast delivery»
В кваліфікаційній роботі бакалавра для тестування мобільного додатку «Fast
delivery» використано сервіс Firebase Test Lab.
Сервіс Firebase Test Lab for Android розроблений Google. В цілому Firebase
добре підходить командам, які спеціалізуються на розробці для Android. Він має
широкий спектр пристроїв та їх конфігурацій, а також є можливість запуску на
емуляторах. Test Lab включений в єдину підписку на сервіс Firebase і для старту
може бути абсолютно безкоштовний.
Для перевірки належного функціонування додатку з точки зору користувача
було використано тестування програмного забезпечення, що виконується вручну без
використання автоматичних тестів або скриптів. Цей процес включає запуск
55
програми, введення різних даних та перевірку результатів, з метою забезпечення
належного функціонування програмного забезпечення та виявлення можливих
помилок та дефектів.
Тестування може бути здійснене різними способами, зокрема:
− Функціональне тестування: перевірка виконання функціональності програми
відповідно до очікувань. Це включає тестування різних сценаріїв взаємодії з
програмою та перевірку результатів.
− Тестування інтерфейсу користувача: перевірка правильності роботи
інтерфейсу користувача програми, включаючи роботу кнопок та інших елементів
інтерфейсу.
− Тестування відмови: перевірка поведінки програми в разі помилки або
відмови, наприклад, як програма реагує на неправильні вхідні дані.
− Тестування продуктивності: перевірка швидкості та продуктивності програми,
включаючи тестування обсягу даних, часу відгуку та інших параметрів.
− Тестування безпеки: перевірка захисту програми від потенційних атак,
перехоплення даних та інших загроз безпеці програми.
− Під час тестування тестувальник повинен бути уважним, систематичним та
здатним виявити потенційні помилки та проблеми. Після завершення тестування
тестувальник має створити звіт з результатами т естування, в якому описані
виявлені дефекти та їх поточний статус.
Тестування продуктивності розробленого мобільного додатку для замовлення
продуктів харчування показало найвищі результати, що означає про його швидкісну
та ефективну роботу. В процесі тестування було проведено перевірку швидкості
відгуку додатку, обробки великого обсягу даних та інших вимог продуктивності.
Отримані результати свідчать про те, що він може забезпечити швидку та зручну
роботу для користувачів.
Це позитивний результат, який підтверджує відповідність функціональних
вимог мобільного додатку та його здатність працювати з оптимальною
продуктивністю. Такі результати тестування дозволяють зробити висновок про
успішну розробку та належну роботу розробленого мобільного додатку.
56
Проте варто зазначити, що тестування продуктивності є одним з багатьох
аспектів тестування, і необхідно проводити й інші види тестів, такі як:
функціональне тестування, тестування безпеки та інші, щоб забезпечити повну
перевірку функціональності та якості додатку перед його випуском.
Враховуючи високі результати тестування продуктивності, розробники та
тестувальники можуть бути впевнені в тому, що додаток забезпечує швидку та
ефективну роботу для користувачів і сприяє покращенню загального досвіду
використання додатку. На рисунку 3.7 зображено меню тестування мобільного
додатку «Fast delivery» для замовлення продуктів харчування сервісом Firebase Test
Lab, де можна обрати тест та девайси для тестування.
Рисунок 3.7 – Меню тестування мобільного додатку «Fast delivery»
сервісом Firebase Test Lab
Після успішного тестування маємо графік з роботою додатку його
навантаження на процесор та на графічний процесор (рис. 3.8–3.9).
Рисунок 3.8 – Результати тестування мобільного додатку «Fast delivery»
на APl Level 27
57
Рисунок 3.9 – Графіки навантаження
Результати тестування мобільного додатку «Fast delivery» у сервісі Firebase
Test Lab також представлені скріншотами та відео (рис. 3.10).
Рисунок 3.10 – Результати тестування мобільного додатку «Fast delivery»
На тестування додатку методом Robo в сервісі Firebase Test Lab було
витрачено 1 хв 1 сек (рис. 3.11). Це дуже добрий результат, так як було проведено
запуск додатку «Реєстрація» та «Авторизація». Тобто, після тестування було
показано що завантажуваність у додаткау досить швидка та оптимізована під різні
версії Android.
58
Рисунок 3.11 – Час тестування додатку
Графік тестування на APl Level 30 представлено на рис. 3.12.
Рисунок 3.12 – Графік тестування додатку
на APl Level 30
Після тестування сервіс надає зауваження та рекомендації, що потрібно
змінити для покращення роботи додатку (рис. 3.13–3.14). Для покращення
розробленого додатку «Fast delivery» сервіс рекомендує змінити старі бібліотеки на
нові та змінити дизайн назви додатку на інший колір, який буде контрастувати з
дизайном.
Рисунок 3.13 – Попередження та зауваження в додатку
59
Рисунок 3.14 – Бібліотеки, які варто змінити
Висновки до розділу 3
В даному розділі представлена програмна реалізація. Визначено, що програма
буде створена з використанням мови програмування Java для покращення навиків
програмування за допомогою Android Studio, а управління здійснюватиметься за
допомогою камп’ютерної мишки в емуляторі.
Описано інтерфейс та програмну реалізацію розробленого мобільного додатку
для замовлення продуктів харчування, а також тестування розробленого додатку.
Виконано тестування розробленого мобільного додатку «Fast delivery» для
замовлення продуктів харчування. Результати тестування дозволяють зробити
висновок про успішну розробку мобільного додатку та його належну роботу.
60
ВИСНОВКИ
Мета кваліфікаційної роботи бакалавра досягнута. В ході її виконання
спроектовано та розроблено мобільний додаток для замовлення продуктів
харчування «Fast delivery».
Для досягнення поставленої мети в роботі розв’язувалися наступні завдання:
досліджено предметну область;
виконано порівняльний аналіз існуючих мобільних додатків для замовлення
продуктів харчування, а саме: «Glovo», «Raketa», «UberEats», «BoltFood»;
розроблено базу даних;
обрано програмно-технічні засоби для реалізації задачі дослідження;
розроблено мобільний додаток для замовлення продуктів харчування «Fast
delivery» та виконано його тестування.
Мобільний додаток для замовлення продуктів харчування «Fast delivery»
розроблений на мові Java. Створення та робота з базою даних відбувалась із
застосуванням Firebase. Контроль проекту та написання коду здійснювалось у
середовищі Android Studio.
Обрані технології задовольняють всім функціональним і не функціональним
вимогам до такого типу програмного забезпечення.
Розроблений мобільний додаток має зручний, зрозумілий та приємний
інтерфейс.
61
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Архітектура мобільних додатків. URL:
https://wezom.com.ua/ua/blog/arhitektura-mobilnogo-prilozheniya (дата
звернення: 21.01.2023)
2. Проектування бази даних. URL:
https://stud.com.ua/62415/menedzhment/proektuvannya_bazi_danih (дата
звернення: 24.01.2023).
3. Створення програми для Android. URL: https://itproger.com/course/java-android
(дата звернення: 12.04.2023).
4. Підключення бази даних. URL: https://firebase.google.com/docs/android/setup
(дата звернення: 01.03.2023).
5. Програмування для Android. URL: https://metanit.com/java/android/ (дата
звернення: 28.04.2023).
6. Переваги та особливості Android Studio. URL:
https://qagroup.com.ua/publications/android-studio-perevagy-ta-osoblyvosti/ (дата
звернення: 18.04.2023).
7. Теоретичні відомості мови програмування Java. URL:
https://uk.wikipedia.org/wiki/Java (дата звернення: 03.05.2023).
8. Програмування під Android на Java. URL: https://metanit.com/java/android/ (дата
звернення: 21.05.2023).
9. Огляд рішень для тестування сайтів, різні види тестів для веб-додатків і
вживане. URL: http://hostinfo.ru/articles/442 (дата звернення: 12.05.2023).
10. Тестування WEB-додатків. URL: http://taac.org.ua/files/a2011/proceedings/UA-1-
Viktoria%20-173.pdf (дата звернення: 13.05.2023).
62
ДОДАТОК А
Затверджую
Зав. кафедри КНСА,
______________ Юрій ТРИУС
«____»____________2023 р.
МОБІЛЬНИЙ ДОДАТОК ДЛЯ ЗАМОВЛЕННЯ ПРОДУКТІВ ХАРЧУВАННЯ
Специфікація
482.ЧДТУ. 32225-01
Листів 2
Розробник ____________________ Передерій О.С.
Керівник ____________________ Оксамитна Л.П.
Черкаси – 2023
63
482.ЧДТУ. 32225-01
Позначення Найменування Примітка
Документація
482.ЧДТУ. 32225-01 12 01 Текст програми
482.ЧДТУ. 32225-01 34 01 Інструкція користувача
482.ЧДТУ. 32003-01 90 01 Структура бази даних
64
ДОДАТОК Б
МОБІЛЬНИЙ ДОДАТОК ДЛЯ ЗАМОВЛЕННЯ ПРОДУКТІВ ХАРЧУВАННЯ
Текст програми
482.ЧДТУ. 32225-01 12 01
Листів 23
Розробник _____________ Передерій О.С.
Черкаси – 2023
65
Фрагмент програми
Клас MainActivity:
package com.example.zakaz.Users;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.example.zakaz.LoginActivity;
import com.example.zakaz.Model.User;
import com.example.zakaz.Prevaent.Constants;
import com.example.zakaz.R;
import com.example.zakaz.RegisterActivity;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import io.paperdb.Paper;
public class MainActivity extends AppCompatActivity {
private Button joinButton;
private Button loginButton;
private ProgressDialog LoadingBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
joinButton = (Button) findViewById(R.id.main_join_btn);
loginButton = (Button) findViewById(R.id.main_login_btn);
LoadingBar = new ProgressDialog(this);
Paper.init(this);
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Constants.currentOnlineUser = null;
Constants.currentUserOrder = null;
Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(loginIntent);
}
});
joinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Constants.currentOnlineUser = null;
66
Constants.currentUserOrder = null;
Intent registerIntent = new Intent(MainActivity.this, RegisterActivity.class);
startActivity(registerIntent);
}
});
String UserPhoneKey = Paper.book().read(Constants.UserPhoneKey);
String UserPasswordKey = Paper.book().read(Constants.UserPasswordKey);
if (UserPhoneKey != "" && UserPasswordKey != "") {
if (!TextUtils.isEmpty(UserPhoneKey) && !TextUtils.isEmpty(UserPasswordKey)) {
ValidatUser(UserPhoneKey, UserPasswordKey);
LoadingBar.setTitle("Вхід до додатку");
LoadingBar.setMessage("Будь ласка зачекайте...");
LoadingBar.setCanceledOnTouchOutside(false);
LoadingBar.show();
}
}
}
private void ValidatUser(final String phone, final String password) {
final DatabaseReference RootRef;
RootRef = FirebaseDatabase.getInstance().getReference();
RootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child("Users").child(phone).exists()) {
User userData = dataSnapshot.child("Users").child(phone).getValue(User.class);
if (userData.getPhone().equals(phone)) {
if (userData.getPassword().equals(password)) {
Constants.currentOnlineUser = userData;
LoadingBar.dismiss();
Toast.makeText(MainActivity.this, "Успішний вхід", Toast.LENGTH_SHORT).show();
Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(homeIntent);
} else {
LoadingBar.dismiss();
}
}
} else {
LoadingBar.dismiss();
Toast.makeText(MainActivity.this, "Аккаунт з номером телефону " + phone + "не існує",
Toast.LENGTH_SHORT).show();
Intent registerIntent = new Intent(MainActivity.this, RegisterActivity.class);
startActivity(registerIntent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
67
Клас Реєстрації:
package com.example.zakaz;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.HashMap;
public class RegisterActivity extends AppCompatActivity {
private Button registerBtn;
private EditText usernameInput, phoneInput, passwordInput;
private ProgressDialog LoadingBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
registerBtn = (Button) findViewById(R.id.register_btn);
usernameInput = (EditText) findViewById(R.id.register_username_input);
phoneInput = (EditText) findViewById(R.id.register_phone_input);
passwordInput = (EditText) findViewById(R.id.register_password_input);
LoadingBar = new ProgressDialog(this);
registerBtn.setOnClickListener(new View.OnClickListener() {
@Override
68
public void onClick(View v) {
CreateAccount();
}
});
}
private void CreateAccount() {
String username = usernameInput.getText().toString();
String phone = phoneInput.getText().toString();
String password = passwordInput.getText().toString();
if(TextUtils.isEmpty(username)){
Toast.makeText(this, "Введіть ім'я", Toast.LENGTH_SHORT).show();
}
else if(TextUtils.isEmpty(phone)){
Toast.makeText(this, "Введіть номер телефону", Toast.LENGTH_SHORT).show();
}
else if(TextUtils.isEmpty(password)){
Toast.makeText(this, "Введіть пароль", Toast.LENGTH_SHORT).show();
}
else {
LoadingBar.setTitle("Створення акаунта");
LoadingBar.setMessage("Будь ласказачекайте...");
LoadingBar.setCanceledOnTouchOutside(false);
LoadingBar.show();
ValidatePhone(username, phone, password);
}
}
private void ValidatePhone(final String username, final String phone, final String password) {
final DatabaseReference RootRef;
RootRef = FirebaseDatabase.getInstance().getReference();
RootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(!dataSnapshot.child("Users").child(phone).exists())
{
HashMap<String, Object> userDataMap=new HashMap<>();
69
userDataMap.put("phone", phone);
userDataMap.put("name", username);
userDataMap.put("password", password);
RootRef.child("Users").child(phone).updateChildren(userDataMap)
.addOnCompleteListener(new OnCompleteListener<Void>(){
@Override
public void onComplete(@NonNull Task<Void> task){
if(task.isSuccessful()){
LoadingBar.dismiss();
Toast.makeText(RegisterActivity.this,"Реєстрація пройшла успішно.",
Toast.LENGTH_SHORT).show();
Intent loginIntent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(loginIntent);
}
else {
LoadingBar.dismiss();
Toast.makeText(RegisterActivity.this,"Помилка", Toast.LENGTH_SHORT).show();
}
}
});
}
else {
LoadingBar.dismiss();
Toast.makeText(RegisterActivity.this,"Номер" + phone + "уже
зареєстрований",Toast.LENGTH_SHORT).show();
Intent loginIntent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(loginIntent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
70
Клас Авторизації:
package com.example.zakaz;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.example.zakaz.Admin.AdminCategoryActivity;
import com.example.zakaz.Model.User;
import com.example.zakaz.Prevaent.Constants;
import com.example.zakaz.Users.HomeActivity;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.rey.material.widget.CheckBox;
import io.paperdb.Paper;
public class LoginActivity extends AppCompatActivity {
private Button loginBtn;
private EditText phoneInput, passwordInput;
private ProgressDialog LoadingBar;
private TextView AdminLink, NotAdminLink;
private String parentDbName = "Users";
private CheckBox checkBoxRememberMe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
loginBtn = (Button) findViewById(R.id.login_btn);
71
phoneInput = (EditText) findViewById(R.id.login_phone_input);
passwordInput = (EditText) findViewById(R.id.login_password_input);
LoadingBar = new ProgressDialog(this);
checkBoxRememberMe = (CheckBox) findViewById(R.id.login_checkbox);
Paper.init(this);
AdminLink = (TextView) findViewById(R.id.admin_panel_link);
NotAdminLink = (TextView) findViewById(R.id.not_admin_panel_link);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginUser();
}
});
AdminLink.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AdminLink.setVisibility(View.INVISIBLE);
NotAdminLink.setVisibility(View.VISIBLE);
loginBtn.setText("Вхід для адміна");
parentDbName = "Admins";
}
});
NotAdminLink.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AdminLink.setVisibility(View.VISIBLE);
NotAdminLink.setVisibility(View.INVISIBLE);
loginBtn.setText("Увійти");
parentDbName = "Users";
}
});
}
private void LoginUser() {
String phone = phoneInput.getText().toString();
String password = passwordInput.getText().toString();
72
if (TextUtils.isEmpty(phone)) {
Toast.makeText(this, "Введіть номер телефону", Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(password)) {
Toast.makeText(this, "Введіть пароль", Toast.LENGTH_SHORT).show();
} else {
LoadingBar.setTitle("Вхід до додатку");
LoadingBar.setMessage("Будь ласка зачекайте...");
LoadingBar.setCanceledOnTouchOutside(false);
LoadingBar.show();
ValidateUser(phone, password);
}
}
private void ValidateUser(final String phone, final String password) {
if (checkBoxRememberMe.isChecked()) {
Paper.book().write(Constants.UserPhoneKey, phone);
Paper.book().write(Constants.UserPasswordKey, password);
}
final DatabaseReference RootRef;
RootRef = FirebaseDatabase.getInstance().getReference();
RootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(parentDbName).child(phone).exists()) {
User userData = dataSnapshot.child(parentDbName).child(phone).getValue(User.class);
if (userData.getPhone().equals(phone)) {
if (userData.getPassword().equals(password)) {
Constants.currentOnlineUser = userData;
if (parentDbName.equals("Users")) {
LoadingBar.dismiss();
Toast.makeText(LoginActivity.this, "Успішний вхід", Toast.LENGTH_SHORT).show();
Intent homeIntent = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(homeIntent);
} else if (parentDbName.equals("Admins")) {
LoadingBar.dismiss();
Toast.makeText(LoginActivity.this, "Успішний вхід", Toast.LENGTH_SHORT).show();
Intent homeIntent = new Intent(LoginActivity.this, AdminCategoryActivity.class);
73
startActivity(homeIntent);
}
} else {
LoadingBar.dismiss();
Toast.makeText(LoginActivity.this, "Неправильний пароль", Toast.LENGTH_SHORT).show();
}
}
} else {
LoadingBar.dismiss();
Toast.makeText(LoginActivity.this, "Аккаунт з номером телефону " + phone + "не існує",
Toast.LENGTH_SHORT).show();
Intent registerIntent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(registerIntent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
Головний екран додатку:
package com.example.zakaz.Users;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.ui.AppBarConfiguration;
74
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.zakaz.LoginActivity;
import com.example.zakaz.Model.Order;
import com.example.zakaz.Model.OrderProduct;
import com.example.zakaz.Model.Product;
import com.example.zakaz.Prevaent.Constants;
import com.example.zakaz.R;
import com.example.zakaz.adapters.ProductsAdapter;
import com.example.zakaz.callbacks.ProductClickListener;
import com.example.zakaz.callbacks.ProductsDownloadListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import de.hdodenhof.circleimageview.CircleImageView;
import io.paperdb.Paper;
public class HomeActivity extends AppCompatActivity implements
NavigationView.OnNavigationItemSelectedListener {
private AppBarConfiguration mAppBarConfiguration;
private ProductsAdapter productsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle("Меню");
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
75
public void onClick(View view) {
navigateToCart();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
}
};
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0);
TextView userNameTextView = headerView.findViewById(R.id.user_profile_name);
CircleImageView profileImageView = headerView.findViewById(R.id.user_profile_image);
userNameTextView.setText(Constants.currentOnlineUser.getName());
Picasso.get().load(Constants.currentOnlineUser.getImage()).placeholder(R.drawable.profile).into(profileImageVie
w);
getCurrentOrder();
configureProductsRecyclerView();
}
@Override
public void onBackPressed() {
DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
76
protected void onResume() {
super.onResume();
//кожен раз при поверненні на сторінку оновлюємо дані замовлення та список
getCurrentOrder();
productsAdapter.update();
}
@Override
protected void onPause() {
super.onPause();
//під час виходу зі сторінки зберігаємо поточне замовлення
Paper.book().write(Constants.CurrentUserOrder, Constants.currentUserOrder);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.home, menu);
return true;
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_cart) {
navigateToCart();
} else if (id == R.id.nav_orders) {
} else if (id == R.id.nav_settings) {
Intent loginIntent = new Intent(HomeActivity.this, SettingsActivity.class);
startActivity(loginIntent);
} else if (id == R.id.nav_logout) {
Paper.book().destroy();
Constants.currentOnlineUser = null;
Constants.currentUserOrder = null;
Intent loginIntent = new Intent(HomeActivity.this, LoginActivity.class);
startActivity(loginIntent);
}
DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
drawerLayout.closeDrawer(GravityCompat.START);
77
return false;
}
private void navigateToCart() {
startActivity(new Intent(this, CartActivity.class));
}
private void getCurrentOrder() {
Order current = Paper.book().read(Constants.CurrentUserOrder);
if (current == null) {
//якщо немає запису про поточне замовлення -- створюємо новий
current = new Order(Constants.currentOnlineUser.getPhone());
Paper.book().write(Constants.CurrentUserOrder, current);
}
Constants.currentUserOrder = current;
Order.logOrder("Current order get: " + new Gson().toJson(current));
}
private void configureProductsRecyclerView() {
ProductClickListener productClickListener = new ProductClickListener() {
@Override
public void onProductBasketClick(Product product) {
//додаємо продукт в поточне замовлення
Constants.currentUserOrder.addProduct(new OrderProduct(product));
}
};
ProductsDownloadListener downloadListener = new ProductsDownloadListener() {
@Override
public void onProductsLoaded(ArrayList<Product> products) {
//як тільки продукти скачаються -- відобразити їх у списку
productsAdapter.setProducts(products);
}
};
productsAdapter = new ProductsAdapter(this, productClickListener);
RecyclerView recyclerView = findViewById(R.id.recycler_menu);
recyclerView.setAdapter(productsAdapter);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); // 2 колонки
downloadAllProducts(downloadListener);
}
private void downloadAllProducts(ProductsDownloadListener productsDownloadListener) {
78
final String PRODUCTS_DB_CHILD = "Products";
DatabaseReference productsReference = FirebaseDatabase
.getInstance()
.getReference()
.child(PRODUCTS_DB_CHILD);
productsReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ArrayList<Product> products = new ArrayList<>();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
try {
Product current = postSnapshot.getValue(Product.class);
if (current != null) products.add(current);
} catch (Exception e) {
e.printStackTrace();
}
}
productsDownloadListener.onProductsLoaded(products);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(
HomeActivity.this,
"Щось пішло не так :(",
Toast.LENGTH_SHORT
).show();
android.util.Log.e("tag-error", error.getMessage());
}
});
}
}
Корзина для замовлення:
package com.example.zakaz.Users;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
79
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.zakaz.Model.Order;
import com.example.zakaz.Prevaent.Constants;
import com.example.zakaz.R;
import com.example.zakaz.adapters.CartAdapter;
import com.example.zakaz.callbacks.OrderProductsClickListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.HashMap;
import io.paperdb.Paper;
public class CartActivity extends AppCompatActivity {
private final Order currentOrder = Constants.currentUserOrder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
updateProductData();
initializeListeners();
configureCartRecyclerView();
}
@Override
protected void onPause() {
super.onPause();
Paper.book().write(Constants.CurrentUserOrder, Constants.currentUserOrder);
80
}
private void updateProductData() {
String fullPrice = currentOrder.getFullOrderPrice() + " грн";
((TextView) findViewById(R.id.cart_price_value_tv)).setText(fullPrice);
((TextView)
findViewById(R.id.cart_amount_value_tv)).setText(String.valueOf(currentOrder.getProductsAmount()));
}
private void initializeListeners() {
findViewById(R.id.cart_apply_order_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendOrderToFirebase();
}
});
}
private void configureCartRecyclerView() {
OrderProductsClickListener orderProductsClickListener = new OrderProductsClickListener() {
@Override
public void onDeleteClick() {
updateProductData();
}
@Override
public void onProductAmountChanged() {
updateProductData();
}
};
RecyclerView recyclerView = findViewById(R.id.cart_recycler);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new CartAdapter(this, currentOrder, orderProductsClickListener));
}
private void sendOrderToFirebase() {
final DatabaseReference RootRef;
RootRef = FirebaseDatabase.getInstance().getReference();
ProgressDialog orderCreatingProgress = new ProgressDialog(CartActivity.this);
orderCreatingProgress.setTitle("Створення замовлення");
orderCreatingProgress.setMessage("Будь ласка зачекайте...");
orderCreatingProgress.setCanceledOnTouchOutside(false);
81
orderCreatingProgress.show();
RootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
HashMap<String, Object> orderMap = new HashMap<>();
orderMap.put("id", currentOrder.getId());
orderMap.put("productsJson", currentOrder.getProductsJson());
orderMap.put("price", currentOrder.getFullOrderPrice());
orderMap.put("userPhone", currentOrder.getUserPhone());
RootRef.child("Orders")
.push()
.setValue(orderMap)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
orderCreatingProgress.dismiss();
Toast.makeText(CartActivity.this, "Замовлення додано.", Toast.LENGTH_SHORT).show();
Constants.currentUserOrder = new Order(Constants.currentOnlineUser.getPhone());
Paper.book().write(Constants.CurrentUserOrder, Constants.currentUserOrder);
startActivity(new Intent(CartActivity.this, HomeActivity.class));
} else {
orderCreatingProgress.dismiss();
Toast.makeText(CartActivity.this, "Помилка", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
orderCreatingProgress.dismiss();
Toast.makeText(CartActivity.this, "Помилка", Toast.LENGTH_SHORT).show();
}
});
}
}
82
Клас налаштування користувачів:
package com.example.zakaz.Users;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.example.zakaz.Prevaent.Constants;
import com.example.zakaz.R;
import com.google.android.gms.tasks.Continuation;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.StorageTask;
import com.squareup.picasso.Picasso;
import com.theartofdev.edmodo.cropper.CropImage;
import com.theartofdev.edmodo.cropper.CropImageView;
import java.util.HashMap;
import de.hdodenhof.circleimageview.CircleImageView;
public class SettingsActivity extends AppCompatActivity {
private CircleImageView profileImageViev;
83
private EditText fullNameEditText, userPhoneEditText, addressEditText;
private TextView saveTextBtn, closeTextBtn;
private Uri imageUri;
private String checker = "";
private StorageReference storageProfilePictureRef;
private StorageTask uploadTask;
private ActivityResultLauncher<Intent> cropActivityLauncher = registerForActivityResult(new
ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == RESULT_OK) {
CropImage.ActivityResult dropResult = CropImage.getActivityResult(result.getData());
imageUri = dropResult.getUri();
profileImageViev.setImageURI(imageUri);
uploadImage();
} else {
Toast.makeText(this, "Помилка", Toast.LENGTH_SHORT).show();
startActivity(new Intent(SettingsActivity.this, SettingsActivity.class));
finish();
}
});
private ActivityResultLauncher<Intent> galleryActivityLauncher = registerForActivityResult(new
ActivityResultContracts.StartActivityForResult(), result -> {
// the datatype of result is androidx.activity.result.ActivityResult
if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData();
if (data == null) {
// Log.d(TAG, "initializeActivityLaunchers: intent data is null");
return;
}
Uri selectedImageUri = data.getData();
if (null != selectedImageUri) {
Intent intent = CropImage.activity(selectedImageUri)
.setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1, 1)
.getIntent(this);
cropActivityLauncher.launch(intent);
} else {
// Log.d(TAG, "initializeActivityLaunchers: selected image uri is null");
// maybe the user returned from gallery without choosing any image
84
}
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
profileImageViev = (CircleImageView) findViewById(R.id.settings_account_image);
fullNameEditText = (EditText) findViewById(R.id.settings_fullname);
userPhoneEditText = (EditText) findViewById(R.id.settings_phone);
addressEditText = (EditText) findViewById(R.id.settings_address);
saveTextBtn = (TextView) findViewById(R.id.seve_settings_tv);
closeTextBtn = (TextView) findViewById(R.id.close_settings_tv);
storageProfilePictureRef = FirebaseStorage.getInstance().getReference().child("Profile_pictures");
userInfoDisplay(profileImageViev, fullNameEditText, userPhoneEditText, addressEditText);
closeTextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent loginIntent = new Intent(SettingsActivity.this, HomeActivity.class);
startActivity(loginIntent);
}
});
saveTextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checker.equals("clicked")) {
userInfoSaved();
} else {
updateOnlyUserInfo();
}
}
});
profileImageViev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
85
checker = "clicked";
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
galleryActivityLauncher.launch(intent);
}
});
}
private void userInfoDisplay(final CircleImageView profileImageViev, final EditText fullNameEditText, final
EditText userPhoneEditText, final EditText addressEditText) {
DatabaseReference UsersRef =
FirebaseDatabase.getInstance().getReference().child("Users").child(Constants.currentOnlineUser.getPhone());
UsersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
if (snapshot.child("image").exists()) {
String image = snapshot.child("image").getValue().toString();
String name = snapshot.child("name").getValue().toString();
String phone = snapshot.child("phone").getValue().toString();
String address = snapshot.child("address").getValue().toString();
Picasso.get().load(image).into(profileImageViev);
fullNameEditText.setText(name);
userPhoneEditText.setText(phone);
addressEditText.setText(address);
}
if (snapshot.child("address").exists()) {
String name = snapshot.child("name").getValue().toString();
String phone = snapshot.child("phone").getValue().toString();
String address = snapshot.child("address").getValue().toString();
fullNameEditText.setText(name);
userPhoneEditText.setText(phone);
addressEditText.setText(address);
}
}
}
86
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
private void userInfoSaved() {
if (TextUtils.isEmpty(fullNameEditText.getText().toString())) {
Toast.makeText(this, "Введіть ім'я", Toast.LENGTH_SHORT).show();
}
if (TextUtils.isEmpty(addressEditText.getText().toString())) {
Toast.makeText(this, "Введіть адресу", Toast.LENGTH_SHORT).show();
}
if (TextUtils.isEmpty(userPhoneEditText.getText().toString())) {
Toast.makeText(this, "Введіть телефон", Toast.LENGTH_SHORT).show();
} else if (checker.equals("clicked")) {
uploadImage();
}
}
private void uploadImage() {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Загрузка данных");
progressDialog.setMessage("Пожалуйста, подождите...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
if (imageUri != null) {
final StorageReference fileRef = storageProfilePictureRef
.child(Constants.currentOnlineUser.getPhone() + ".WebP");
uploadTask = fileRef.putFile(imageUri);
uploadTask.continueWithTask(new Continuation() {
@Override
public Object then(@NonNull Task task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return fileRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
87
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUrl = task.getResult();
String myUrl = downloadUrl.toString();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users");
HashMap<String, Object> userMap = new HashMap<>();
userMap.put("name", fullNameEditText.getText().toString());
userMap.put("address", addressEditText.getText().toString());
userMap.put("phoneOrder", userPhoneEditText.getText().toString());
userMap.put("image", myUrl);
ref.child(Constants.currentOnlineUser.getPhone()).updateChildren(userMap);
progressDialog.dismiss();
startActivity(new Intent(SettingsActivity.this, HomeActivity.class));
Toast.makeText(SettingsActivity.this, "Інформацію успішно збережено",
Toast.LENGTH_SHORT).show();
finish();
} else {
progressDialog.dismiss();
Toast.makeText(SettingsActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
}
});
} else {
Toast.makeText(SettingsActivity.this, "Зображення не вибрано", Toast.LENGTH_SHORT).show();
}
}
private void updateOnlyUserInfo() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users");
HashMap<String, Object> userMap = new HashMap<>();
userMap.put("name", fullNameEditText.getText().toString());
userMap.put("address", addressEditText.getText().toString());
userMap.put("phoneOrder", userPhoneEditText.getText().toString());
ref.child(Constants.currentOnlineUser.getPhone()).updateChildren(userMap);
startActivity(new Intent(SettingsActivity.this, HomeActivity.class));
Toast.makeText(SettingsActivity.this, "Успішно збережено", Toast.LENGTH_SHORT).show();
finish();}}
88
ДОДАТОК В
МОБІЛЬНИЙ ДОДАТОК ДЛЯ ЗАМОВЛЕННЯ ПРОДУКТІВ ХАРЧУВАННЯ
ІНСТРУКЦІЯ КОРИСТУВАЧА
482. ЧДТУ. 32225-01 34 01
Листів 5
Розробник _____________ Передерій О.С.
Черкаси – 2023
89
Додаток був розроблений таким чином, що включає в себе дві основні ролі
користувача для додатку:
− Покупець: (користувач, сучасний покупець).
− Адміністратор: (адміністратор магазину).
Авторизація / як Покупець зареєструється в додатку, ввівши потрібну
інформацію на екрані реєстрації. Після реєстрації покупець зможе увійти на сайт.
При цьому буде інструкція: «Введіть ім’я користувача», «Введіть свій номер
телефону», «Введіть пароль», «Натисніть кнопку реєстрації», щоб зареєструватися в
додатку.
На рис. В.1 представлено процес «Реєстрація».
Рисунок В.1 – Процес «Реєстрація»
90
Після успішної реєстрації можна перейти до авторизації. Якщо є акаунт з
доступом до адміністратора, то на екрані «Реєстрація» є поле, при натисканні якого
можемо зайти як адмін (рис. В.2).
Рисунок В.2 – Процес «Авторизація»
Після авторизації потрапляємо до головної сторінки додатку, де можемо
спостерігати за каталогом продуктів харчування, кнопки «Корзина» та виклику
«Меню» зліва вгорі (рис. В.3).
91
Рисунок В.3 – Головна сторінка додатку
На рис В.4 зображено навігаційне меню. У верхній його частині створено
профіль користувача та його фото.
В нижній частині – 4 навігаційні пункти для керування додатком.
92
Рисунок В.4 – Навігаційне меню додатку
«Корзина» для користувача зроблена максимально зрозуміла для видалення
продукту харчування або для збільшення чи зменшення його кількості зроблено
відповідні кнопки (рис. В.5).
Також в додатку було реалізовано редагування свого профілю (рис. В.6). Тут
можемо змінити номер телефону, своє фото, адресу місця доставки та своє ім’я.
93
Рисунок В.5 – «Корзина» для замовлення продуктів харчування
Рисунок В.6 – Екран для редагування профілю
94
ДОДАТОК Г
МОБІЛЬНИЙ ДОДАТОК ДЛЯ ЗАМОВЛЕННЯ ПРОДУКТІВ ХАРЧУВАННЯ
Структура бази даних
482. ЧДТУ. 32225-01 90 01
Листів 3
Розробник _____________ Передерій О.С.
Черкаси – 2023
95
Рисунок Г.1 – Структура бази даних
Рисунок Г.2 – Таблиця продуктів харчування в базі даних
96
Рисунок Г.3 – Таблиця замовлень в базі даних
Рисунок Г.4 – Таблиця користувачів у базі даних