Alcaa
Alkaa is a simple to-do list. Open source.
Android
Third-Party
Quality check
Tests
Continuous Integration
Просмотр кода
- Краткие и емкие названия
- есть комментарии, часто избыточные
/**
* Provide the date and time to be used on the task use cases, respecting the Inversion of Control.
*/
interface CalendarProvider {
/**
* Gets the current [Calendar].
*
* @return the current [Calendar]
*/
fun getCurrentCalendar(): Calendar
}
1. Используется Koin
:: С десятью классами во вьюмодел, напряжно делать ручные injectors
2. Поток данных
Fragment -> ViewModel -> use cases -> repository -> dao
3. Repository
CategoryRepository
insertCategory(category: Category)
insertCategory(categoryList: List<Category>)
updateCategory(category: Category)
deleteCategory(category: Category)
cleanTable()
findAllCategories(): Flow<List<Category>>
findCategoryById(categoryId: Long): Category?
TaskRepository
insertTask(task: Task)
updateTask(task: Task)
deleteTask(task: Task)
cleanTable()
findAllTasksWithDueDate(): List<Task>
findTaskById(taskId: Long): Task
SearchRepository Первый раз вижу такой вид репозитория, обычно репозитории делают отдельно на сущности.
suspend fun findTaskByName(query: String): List<TaskWithCategory>}
TaskWithCategoryRepository
fun findAllTasksWithCategory(): Flow<List<TaskWithCategory>>
fun findAllTasksWithCategoryId(categoryId: Long): Flow<List<TaskWithCategory>>
3. Repository реализация
SearchRepositoryImpl
internal class SearchRepositoryImpl(
private val searchDataSource: SearchDataSource,
private val mapper: TaskWithCategoryMapper
) : SearchRepository {
override suspend fun findTaskByName(query: String): List<TaskWithCategory> =
mapper.toDomain(searchDataSource.findTaskByName(query))
}
**CategoryRepositoryImpl **
internal class CategoryRepositoryImpl(
private val categoryDataSource: CategoryDataSource,
private val categoryMapper: CategoryMapper
) : CategoryRepository {
override suspend fun insertCategory(category: Category) =
categoryDataSource.insertCategory(categoryMapper.toRepo(category))
override suspend fun insertCategory(categoryList: List<Category>) =
categoryDataSource.insertCategory(categoryMapper.toRepo(categoryList))
SearchRepositoryImpl
internal class SearchRepositoryImpl(
private val searchDataSource: SearchDataSource,
private val mapper: TaskWithCategoryMapper
) : SearchRepository {
override suspend fun findTaskByName(query: String): List<TaskWithCategory> =
mapper.toDomain(searchDataSource.findTaskByName(query))
}
3. Use cases
Краткие названия, красивые классы. Супер
- task
- AddTask
- CompleteTask
- GetTask
- UpdateTask
- UpdateTaskStatus
- taskwithcategory
- LoadCompletedTasks
- LoadTasksByCategory
-
search
- SearchTaskByName
- alarm
- CancelAlarm
- ScheduleAlram
- ShowAlarm
- SnoozeAlarm
- UpdateTaskAsRepeating