✨ “Планируйте уверенно. Бронируйте без ошибок.”
«Зал Свободен» — это Android-приложение нового поколения для умного управления расписанием конференц-залов.
Оно полностью избавляет от проблем с пересекающимися бронированиями, дублированием встреч и ручным вводом расписания.
💡 Основано на Kotlin + Jetpack Compose, с реактивным интерфейсом и надёжным хранением состояния.
Создано с нуля по принципам чистой архитектуры (MVVM).
- 🔍 Мгновенная проверка доступности: система автоматически отслеживает пересечения интервалов.
- 🚫 Предотвращение конфликтов: пользователю выводится уведомление, если время занято.
- 💾 Персистентность: данные сохраняются между запусками через
SavedStateHandle+Gson.
- 📅 Группировка по датам: события отображаются с удобными заголовками — Сегодня, Завтра, Понедельник, 14 Октября.
- 🕓 Материальные пикеры: выбор даты и времени через стандартные диалоги Material 3.
- 💬 Мгновенное обновление: добавленные события появляются сразу, без перезапуска экрана.
- 🎨 Material 3 Design — минимализм, контраст и акценты.
- 🧩 Jetpack Compose — декларативный и читаемый код интерфейса.
- 🧭 MVVM Архитектура — чистое разделение логики, состояния и отображения.
com.example.conferencescheduler/
│
├── model/
│ └── Event.kt # Модель события
│
├── viewmodel/
│ └── ScheduleViewModel.kt # Бизнес-логика, проверка пересечений, сохранение состояния
│
├── ui/
│ ├── ScheduleScreen.kt # Главный экран расписания
│ └── components/
│ └── AddEventDialog.kt # Диалог добавления события (дата, время, название)
│
└── util/
🧭 MVVM в действии:
- Model — хранит структуру данных (
Event) - ViewModel — управляет логикой, проверками и сохранением (
ScheduleViewModel) - View (Compose) — показывает интерфейс и обновляется реактивно (
ScheduleScreen,AddEventDialog)
Добавление нового события 🕓
При нажатии ➕ открывается диалог, где пользователь вводит название и выбирает дату/время.
После подтверждения:
- Происходит проверка на пересечения.
- Если слот свободен — событие добавляется и сохраняется.
- Если занят — показывается уведомление «Зал занят в интервале 14:00–15:00».
fun isAvailable(start: LocalDateTime, end: LocalDateTime): Boolean {
return events.none { event ->
start.isBefore(event.endTime) && end.isAfter(event.startTime)
}
}🔒 Простая и надёжная проверка на пересечения временных интервалов.
-
📥 Клонировать репозиторий:
git clone https://github.com/NotACat1/ConferenceScheduler.git
-
🧭 Открыть в Android Studio.
-
⚙️ Синхронизировать Gradle и убедиться, что зависимости загружены.
-
▶️ Запустить на эмуляторе или устройстве. -
🎉 Готово! Добавляйте и управляйте бронированиями без конфликтов.
“Зал Свободен — когда технологии работают на ваше время.” ⏳