Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
7902781
setup goodroad client bootstrap
SanriaArgos Mar 17, 2026
90702f3
feature: windows for auth and registration
SanriaArgos Mar 18, 2026
3c4fe08
Delete docker/.env
SanriaArgos Mar 18, 2026
ccaa1fa
feature: change password if user forgot it
SanriaArgos Mar 18, 2026
1c26373
feature: phone validation and fixing warnings for fist and last names
SanriaArgos Mar 18, 2026
3454238
refactor: now drawPath in AuthDecor looks like a road
SanriaArgos Mar 19, 2026
01df1c3
fix: structure of files for auth screens
VictoriaGrudtsyna Mar 22, 2026
0bfed02
delete: app/src/main/java/com/example/goodroad/ui/AuthApp.kt
VictoriaGrudtsyna Mar 22, 2026
4791d33
add: UserPofileScreen, UserDeleteScreen, UserEditScreen
VictoriaGrudtsyna Mar 22, 2026
4dda8b7
delete: app/src/main/java/com/example/goodroad/ui/user/UserTestApp.kt
VictoriaGrudtsyna Mar 22, 2026
d269626
feat(auth): integrate login and registration calls
VictoriaGrudtsyna Apr 5, 2026
1380dfc
feat: intergrate getUserProfile, updateCurrentUserSettings, deleteCur…
VictoriaGrudtsyna Apr 6, 2026
6863ee8
fix: after registration and login user see profileScreen. after delet…
VictoriaGrudtsyna Apr 7, 2026
a2c70d4
fix: after deleting user see login screen
VictoriaGrudtsyna Apr 7, 2026
53e12a3
fix: now password on deleteScreen can be unvisible, входим... on logi…
VictoriaGrudtsyna Apr 8, 2026
fe9524b
feat: correct work edit screen
VictoriaGrudtsyna Apr 8, 2026
8bc84ba
feat: add icons and validations on edit sreen. fix: structure of files
VictoriaGrudtsyna Apr 9, 2026
8fe9617
feat: displaying user-friendly errors
VictoriaGrudtsyna Apr 9, 2026
2906824
fix(auth-ui): stabilize auth screens and request states
SanriaArgos Apr 10, 2026
ba563ac
fix(profile): align user screens with current backend contract
SanriaArgos Apr 10, 2026
2540072
fix(network): update api client auth handling
SanriaArgos Apr 10, 2026
1e3b474
chore(gradle): add gradle wrapper jar
SanriaArgos Apr 10, 2026
1ed21ad
fix(auth): connect recover-password screen to backend
SanriaArgos Apr 11, 2026
9fe0187
refactor(network): remove setCredentials and keep updateCredentials
SanriaArgos Apr 11, 2026
3c0b359
feat(profile): add avatar upload api and update user data layer
SanriaArgos Apr 11, 2026
306611f
fix(profile-ui): restore phone label and update edit profile flow
SanriaArgos Apr 11, 2026
52e8be0
build(android): add dependencies for profile photo upload
SanriaArgos Apr 11, 2026
82dc78a
add: ObstacleSelectScreen and button to switch to the map
VictoriaGrudtsyna Apr 11, 2026
a2bc4c1
chore: add note about theme color
SanriaArgos Apr 11, 2026
3225c5d
fix: user's edit screen now more cutie
SanriaArgos Apr 12, 2026
4a964a9
style(imports): clean up and shorten imports
SanriaArgos Apr 12, 2026
452c759
fix(user-delete): separate delete flow from back navigation
SanriaArgos Apr 12, 2026
236fdb8
fix(profile-ui): refine profile and edit screen behavior
SanriaArgos Apr 12, 2026
a46891e
style(ui): update colors and obstacle selection screen
SanriaArgos Apr 12, 2026
9003c12
feat(reviews): add review API integration and state management
SanriaArgos Apr 13, 2026
52f2cff
feat(reviews): add navigation to user reviews from profile
SanriaArgos Apr 13, 2026
3709e25
feat(reviews-ui): implement review list, form and details screens
SanriaArgos Apr 13, 2026
0acee5c
fix: viewing of adress
SanriaArgos Apr 13, 2026
8d2d1be
fix(auth): auto-hide status messages on auth screens
SanriaArgos Apr 13, 2026
e8aca83
fix(input): add max-length limits for auth fields
SanriaArgos Apr 13, 2026
3f691ce
fix(obstacles): align obstacle API and models with backend
SanriaArgos Apr 13, 2026
e1ca971
fix(obstacles): update obstacle selection screen behavior
SanriaArgos Apr 13, 2026
a2aab7c
fix(navigation): keep obstacle screen open after saving
SanriaArgos Apr 13, 2026
0831860
fix(reviews): improve review form and details flow
SanriaArgos Apr 13, 2026
f169ea1
fix(reviews-ui): polish review cards and obstacle text
SanriaArgos Apr 13, 2026
b538465
fix(profile): refine edit, photo, and delete account flows
SanriaArgos Apr 13, 2026
3555788
fix: редактировать -> редактировать профиль. fix: new error map for d…
VictoriaGrudtsyna Apr 13, 2026
55c18ad
refactor: Readme
SanriaArgos Apr 14, 2026
21044db
refactor: readme preview
SanriaArgos Apr 14, 2026
781f64d
refactor: center readme preview
SanriaArgos Apr 14, 2026
28673fe
refactor: scheme of client
SanriaArgos Apr 14, 2026
1a95f15
fOBix: fix map ui and map logic
KseniaG8 Apr 14, 2026
1888245
chore: updating gradle configurations
KseniaG8 Apr 14, 2026
a2cf38d
add: add color.xml
KseniaG8 Apr 14, 2026
19e4d2c
feat: add MapActivity and button from profile
KseniaG8 Apr 14, 2026
21fd6b4
add: add xml files
KseniaG8 Apr 14, 2026
637906d
add:
KseniaG8 Apr 19, 2026
9069155
fix: add location files and models
KseniaG8 Apr 20, 2026
b54eb04
fix: add MapActivity in AndroidManifest
VictoriaGrudtsyna Apr 20, 2026
c421f70
fix: add routeApi to ApiClient
KseniaG8 Apr 20, 2026
34cf37f
Merge remote-tracking branch 'origin/fix/logic-of-funtions' into map-…
KseniaG8 Apr 20, 2026
e9ae8cd
fix: ApiClient
KseniaG8 Apr 20, 2026
08a79dc
fix: coordinate order is Lon,Lat
KseniaG8 Apr 20, 2026
d957860
add: add backButton in MapActivity
KseniaG8 Apr 21, 2026
b36a077
fix: fix MapActivity, fix drawRoute and update build.gradle
KseniaG8 Apr 22, 2026
b90ad4f
fix: fix build.gradle for emulator
KseniaG8 Apr 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,4 @@
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
limitations under the License.
193 changes: 114 additions & 79 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,46 @@
![Превью](images/readme_preview.png)
<p align="center">
<img src="images/preview.png" alt="GoodRoad banner" width="974">
</p>

## GoodRoad (Android client)

**Авторы**: ```Городкова Ксения```, ```Грудцына Виктория```, ```Толстограева Виктория```

## Описание проекта

**GoodRoad** — это мобильное приложение для построения пеших инклюзивных маршрутов. В отличие от стандартной навигации по кратчайшему пути, приложение подстраивает путь под ограничения здоровья пользователя. Если полностью безбарьерного маршрута нет, GoodRoad показывает проблемные участки и дает возможность запросить помощь волонтера.

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

## Основная функциональность

- **Профиль пользователя:**
- Выбор препятствий, которые нужно избегать при построении маршрута;
- Интерактивные задания, связанные с оценкой объектов и волонтерством;
- Рейтинг и система начисления баллов за отзывы и волонтерство;
- Лента заявок на помощь с фильтрами по местоположению и времени;
- Подача заявки на улучшение инфраструктуры.
- **Профиль модератора:**
- Обработка заявок о помощи: система реагирования на критические ситуации;
- Модерация отзывов;
- **Карта и маршруты:**
- Влияние отзывов на построение пути.
- Построение 3 вариантов маршрута: **доступный**, **быстрый**, **компромиссный**;
- Выделение проблемных участков и карточки объектов с деталями;
- История маршрутов и сохранение последнего построенного пути.

## MVP

- **Регистрация / вход / восстановление доступа.**
- **Маршрутизация:**
- Выбор избегаемых препятствий в профиле;
- Построение маршрута;
- Отображение маршрута и проблемных участков;
- Хранение препятствий (тип и тяжесть).
- **Отзывы:**
- Чек-лист для оценивания;
- Прикрепление фотографии (опционально);
- Учет отзывов в маршрутизации.
- **Модерация:**
- Проверка отзывов;
- Управление младшими модераторами (в случае главного).
## Краткое описание проекта

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

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

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

## Возможности для каждого типа пользователя (MVP)

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

### Модератор
- Просмотр отзывов, отправленных на проверку;
- Одобрение и отклонение отзывов;
- Работа с модерацией пользовательского контента.

### Главный модератор
- Все возможности обычного модератора;
- Добавление и удаление других модераторов.

## Что планируем добавить к защите

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

## Наши продукты

Expand All @@ -54,57 +53,93 @@
</tr>
<tr>
<td align="center">
<em>Временно недоступно</em>
<em>Скоро тут появится ссылка</em>
</td>
</tr>
</table>

## Как запустить backend в Docker
На данный момент доступна локальная проверка клиентского приложения. Для этого рядом должен находиться серверный репозиторий [GoodRoad-Server](https://github.com/GoodRoad-Project/GoodRoadServer).
Ожидаемая структура каталогов:
```text
GoodRoad-Client/
GoodRoad-Server/
```

## Технологии
### 1. Подготовьте `.env`
Из корня клиентского репозитория выполните:

<table>
<tr>
<th colspan="2" align="center">Основные технологии и инструменты (клиент)</th>
</tr>
<tr>
<th>Компонент</th>
<th>Технологии / Инструменты</th>
</tr>
<tr>
<td><strong>UI</strong></td>
<td>Android SDK, Material Components/ Jetpack Compose</td>
</tr>
<tr>
<td><strong>Карты</strong></td>
<td>Mapbox Android SDK (слои для маршрутов и препятствий)</td>
</tr>
<tr>
<td><strong>Геопозиция</strong></td>
<td>Android Location API</td>
</tr>
<tr>
<td><strong>Оффлайн-данные</strong></td>
<td>Room (кэш профиля, ограничений, препятствий и последнего маршрута)</td>
</tr>
<tr>
<td><strong>Геометрия</strong></td>
<td>JTS (офлайн-операции с геометрией при учете препятствий)</td>
</tr>
</table>
```bash
cp docker/.env.backend.example docker/.env.backend
```

*Технологии серверной части: [в отдельном репозитории](https://github.com/GoodRoad-Project/GoodRoadServer).*
При необходимости можно изменить значения в `docker/.env.backend`.

## Архитектура клиента
### 2. Запустите контейнеры
Из корня `GoodRoad-Client`:

```bash
docker-compose up --build
```

**Временно недоступно**
После запуска поднимутся PostgreSQL + PostGIS, а также backend GoodRoad на Spring Boot.

## Безопасность
### 3. Используйте сервер из Android-клиента
В клиенте используется адрес:

**Временно недоступно**
```text
http://10.0.2.2:8080/
```

## Структура проекта
Этот адрес подходит для Android-эмулятора. Если запускаете приложение на физическом устройстве, адрес сервера нужно заменить на локальный IP компьютера в вашей сети.

| **Схема клиентского приложения**<br>![Архитектура приложения](images/android_scheme.png) |
|:----------------------------------------------------------------------------------------:|
## Технологии клиента

| Категория | Технологии | Назначение |
|---|---|---|
| Язык | Kotlin | Основной язык клиентского приложения |
| UI | Jetpack Compose, Material 3 | Построение экранов и компонентов интерфейса |
| Навигация | Navigation Compose | Переходы между экранами и сценариями |
| Состояние экрана | ViewModel, LiveData | Хранение состояния и обработка логики экранов |
| Асинхронность | Kotlin Coroutines | Выполнение сетевых и фоновых операций |
| Сеть | Retrofit, OkHttp | Работа с REST API |
| JSON | Gson Converter | Сериализация и десериализация DTO |
| Изображения | Coil | Загрузка и отображение изображений |

## Архитектура клиента

*Схемы серверной части: [в отдельном репозитории](https://github.com/GoodRoad-Project/GoodRoadServer)*.
Клиент реализован как Android-приложение на Jetpack Compose. Основной поток взаимодействия внутри клиента: **надо добавить**

### Слои клиентской архитектуры

| Слой | Что включает | Назначение |
|----|---|---|
| UI | `ui/auth`, `ui/user`, `ui/maps`, `ui/reviews`, `ui/theme` | Экраны, компоненты интерфейса, навигационные сценарии |
| ViewModel | `AuthViewModel`, `UserViewModel`, `MapsViewModel`, `ReviewsViewModel` | Состояние экранов, обработка действий пользователя, связь UI и данных |
| Data | `data/auth`, `data/user`, `data/obstacle`, `data/review`, `data/network` | Работа с DTO, репозиториями и сетевыми запросами |
| Network | `ApiClient`, Retrofit API interfaces | Подключение к backend, настройка base URL, сериализация и HTTP-клиент |

### Структура проекта

```text
app/src/main/java/com/example/goodroad/
├── MainActivity.kt
├── data/
│ ├── auth/
│ ├── network/
│ ├── obstacle/
│ ├── review/
│ └── user/
└── ui/
├── auth/
├── common/
├── maps/
├── reviews/
├── theme/
├── user/
└── viewmodel/
```

## Схема клиентского приложения

**надо добавить (а может и не надо)**
1 change: 1 addition & 0 deletions SETUP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## Тут что-то будет позже
120 changes: 120 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}

android {
namespace 'com.example.goodroad'
compileSdk 35

defaultConfig {
applicationId 'com.example.goodroad'
minSdk 28
targetSdk 35
versionCode 1
versionName '1.0'

testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
buildConfigField "boolean", "MOCK_AUTH", "false"
buildConfigField "String", "GOODROAD_SERVER_URL", "\"http://10.0.2.2:8080/\""
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix '.debug'
debuggable true
}
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = '17'
}

buildFeatures {
compose true
buildConfig true
}

composeOptions {
kotlinCompilerExtensionVersion '1.5.14'
}

packaging {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}

dependencies {
implementation 'androidx.compose.foundation:foundation:1.10.5'
implementation 'androidx.compose.runtime:runtime-livedata:1.10.6'
implementation 'androidx.compose.runtime:runtime:1.10.6'
def composeBom = platform('androidx.compose:compose-bom:2024.06.00')

implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7'
implementation 'androidx.activity:activity-compose:1.9.3'
implementation composeBom
androidTestImplementation composeBom

implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.material:material-icons-extended'
implementation 'androidx.navigation:navigation-compose:2.8.5'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7'
implementation 'com.google.android.material:material:1.12.0'

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
implementation 'io.coil-kt:coil-compose:2.7.0'

implementation 'org.maplibre.gl:android-sdk:13.0.2'
implementation 'com.google.maps.android:android-maps-utils:3.8.2'
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.23'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.activity:activity:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation 'org.locationtech.jts:jts-core:1.20.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'org.maplibre.gl:android-sdk:13.0.2'
implementation 'com.google.android.gms:play-services-location:21.3.0'
implementation 'com.graphhopper:graphhopper-core:11.0'
implementation 'com.google.maps.android:android-maps-utils:3.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
implementation 'com.google.maps.android:android-maps-utils:3.8.2'

debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'

implementation 'org.maplibre.gl:android-sdk:11.5.1'
}

configurations.all {
resolutionStrategy {
force 'org.jetbrains.kotlin:kotlin-stdlib:1.9.23'
force 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.23'
force 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.23'
force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23'
}
}
1 change: 1 addition & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# пока пусто
30 changes: 30 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.GoodRoad"
android:usesCleartextTraffic="true">

<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity
android:name=".MapActivity"
android:exported="false" />

</application>

</manifest>
Loading