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