Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@ root = true

[*.{kt,kts}]
ktlint_standard_blank-line-before-declaration=disabled
ktlint_standard_multiline-expression-wrapping = disabled
ktlint_standard_string-template-indent = disabled
ktlint_function_signature_body_expression_wrapping = default
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@ enum class TaskProgressRange {
LAST_7_DAYS,
;

fun startDate(today: LocalDate): LocalDate =
when (this) {
ALL -> today
LAST_YEAR -> today.minusMonths(12).plusDays(1)
LAST_30_DAYS -> today.minusDays(29)
LAST_7_DAYS -> today.minusDays(6)
}
fun startDate(today: LocalDate): LocalDate = when (this) {
ALL -> today
LAST_YEAR -> today.minusMonths(12)
LAST_30_DAYS -> today.minusDays(29)
LAST_7_DAYS -> today.minusDays(6)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,20 @@ internal class AboutFragment : Fragment() {
initRecyclerView()
}

private fun initToolbar() =
with(binding) {
val appCompatActivity = activity as AppCompatActivity
appCompatActivity.setSupportActionBar(toolbar)
appCompatActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
toolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
toolbar.setTitle(UiR.string.about)
}
private fun initToolbar() = with(binding) {
val appCompatActivity = activity as AppCompatActivity
appCompatActivity.setSupportActionBar(toolbar)
appCompatActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
toolbar.setNavigationOnClickListener { requireActivity().onBackPressedDispatcher.onBackPressed() }
toolbar.setTitle(UiR.string.about)
}

private fun initRecyclerView() =
with(binding) {
recycler.layoutManager = LinearLayoutManager(activity)
recycler.adapter =
AboutAdapter().apply {
aboutAdapter = this
}
private fun initRecyclerView() = with(binding) {
recycler.layoutManager = LinearLayoutManager(activity)
recycler.adapter = AboutAdapter().apply {
aboutAdapter = this
}
}

private fun showErrorLoadingAbout() {
Toast.makeText(activity, UiR.string.msg_error, Toast.LENGTH_SHORT).show()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,15 @@ import br.com.sailboat.uicomponent.model.UiModel
import br.com.sailboat.uicomponent.impl.R as UiR

internal class GetAboutView(private val context: Context) : GetAboutViewUseCase {
override suspend fun invoke(): Result<List<UiModel>> =
runCatching {
val items = ArrayList<UiModel>()
items.add(getImageWithTitle())
items.add(getAppDescription())
items.add(getVersion())
items.add(getDevelopedBy())
override suspend fun invoke(): Result<List<UiModel>> = runCatching {
val items = ArrayList<UiModel>()
items.add(getImageWithTitle())
items.add(getAppDescription())
items.add(getVersion())
items.add(getDevelopedBy())

return@runCatching items
}
return@runCatching items
}

private fun getImageWithTitle(): ImageTitleDividerUiModel {
return ImageTitleDividerUiModel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@ internal class AboutViewModel(
}
}

private fun onStart() =
viewModelScope.launch {
try {
viewState.itemViews.value = getAboutViewUseCase().getOrThrow()
} catch (e: Exception) {
logService.error(e)
viewState.viewAction.value = AboutViewAction.ShowErrorLoadingAbout
}
private fun onStart() = viewModelScope.launch {
try {
viewState.itemViews.value = getAboutViewUseCase().getOrThrow()
} catch (e: Exception) {
logService.error(e)
viewState.viewAction.value = AboutViewAction.ShowErrorLoadingAbout
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import br.com.sailboat.todozy.feature.alarm.impl.data.model.AlarmData

internal interface AlarmLocalDataSource {
fun getAlarmByTask(taskId: Long): Result<AlarmData?>
fun getAlarmsByTaskIds(taskIds: List<Long>): Result<List<AlarmData>>
fun deleteByTask(taskId: Long): Result<Unit?>
fun update(alarmData: AlarmData): Result<Unit?>
fun save(alarmData: AlarmData): Result<Long>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,84 +12,100 @@ import java.util.Calendar
internal class AlarmLocalDataSourceSQLite(
database: DatabaseOpenHelperService,
) : BaseSQLite(database), AlarmLocalDataSource {
override fun getAlarmByTask(taskId: Long): Result<AlarmData?> =
runCatching {
val sb = StringBuilder()
sb.append(" SELECT Alarm.* FROM Alarm ")
sb.append(" WHERE Alarm.fkTaskId = $taskId")
override fun getAlarmByTask(taskId: Long): Result<AlarmData?> = runCatching {
val sb = StringBuilder()
sb.append(" SELECT Alarm.* FROM Alarm ")
sb.append(" WHERE Alarm.fkTaskId = $taskId")

val cursor = performQuery(sb.toString())
val cursor = performQuery(sb.toString())

if (cursor.moveToNext()) {
val alarm = buildFromCursor(cursor)
cursor.close()
return@runCatching alarm
}

return@runCatching null
}

override fun deleteByTask(taskId: Long): Result<Unit?> =
runCatching {
val sql = " DELETE FROM Alarm WHERE Alarm.fkTaskId = ?"
val statement = compileStatement(sql)
statement.bindLong(1, taskId)

delete(statement)
if (cursor.moveToNext()) {
val alarm = buildFromCursor(cursor)
cursor.close()
return@runCatching alarm
}

fun deleteAlarmById(alarmId: Long): Result<Unit?> =
runCatching {
val sql = " DELETE FROM Alarm WHERE Alarm.id = ?"
val statement = compileStatement(sql)
statement.bindLong(1, alarmId)
return@runCatching null
}

delete(statement)
override fun getAlarmsByTaskIds(taskIds: List<Long>): Result<List<AlarmData>> = runCatching {
if (taskIds.isEmpty()) {
return@runCatching emptyList()
}

override fun save(alarmData: AlarmData): Result<Long> =
runCatching {
val sb = StringBuilder()
val sb = StringBuilder()
sb.append(" SELECT Alarm.* FROM Alarm ")
sb.append(" WHERE Alarm.fkTaskId IN (")
sb.append(taskIds.joinToString(","))
sb.append(")")

sb.append(" INSERT INTO Alarm ")
sb.append(" (fkTaskId, repeatType, nextAlarmDate, insertingDate, days) ")
sb.append(" VALUES (?, ?, ?, ?, ?); ")

val statement = compileStatement(sb.toString())
statement.bindLong(1, alarmData.taskId)
statement.bindLong(2, alarmData.repeatType.toLong())
statement.bindString(3, alarmData.nextAlarmDate.orEmpty())
statement.bindString(4, Calendar.getInstance().toDateTimeString())
statement.bindString(5, alarmData.days.orEmpty())

insert(statement)
}
val cursor = performQuery(sb.toString())
val alarms = mutableListOf<AlarmData>()

override fun update(alarmData: AlarmData): Result<Unit?> =
runCatching {
val sql = StringBuilder()
sql.append(" UPDATE Alarm SET ")
sql.append(" repeatType = ?, ")
sql.append(" nextAlarmDate = ?, ")
sql.append(" days = ? ")
sql.append(" WHERE id = ? ")

val statement = compileStatement(sql.toString())
statement.bindLong(1, alarmData.repeatType.toLong())
statement.bindString(2, alarmData.nextAlarmDate ?: "")
statement.bindString(3, alarmData.days ?: "")
statement.bindLong(4, alarmData.id)

update(statement)
while (cursor.moveToNext()) {
alarms.add(buildFromCursor(cursor))
}

private fun buildFromCursor(cursor: Cursor) =
AlarmData(
id = getLong(cursor, "id") ?: Entity.NO_ID,
taskId = getLong(cursor, "fkTaskId") ?: Entity.NO_ID,
repeatType = getInt(cursor, "repeatType") ?: RepeatType.NOT_REPEAT.ordinal,
nextAlarmDate = getString(cursor, "nextAlarmDate"),
insertingDate = getString(cursor, "insertingDate"),
days = getString(cursor, "days"),
)
cursor.close()
alarms
}

override fun deleteByTask(taskId: Long): Result<Unit?> = runCatching {
val sql = " DELETE FROM Alarm WHERE Alarm.fkTaskId = ?"
val statement = compileStatement(sql)
statement.bindLong(1, taskId)

delete(statement)
}

fun deleteAlarmById(alarmId: Long): Result<Unit?> = runCatching {
val sql = " DELETE FROM Alarm WHERE Alarm.id = ?"
val statement = compileStatement(sql)
statement.bindLong(1, alarmId)

delete(statement)
}

override fun save(alarmData: AlarmData): Result<Long> = runCatching {
val sb = StringBuilder()

sb.append(" INSERT INTO Alarm ")
sb.append(" (fkTaskId, repeatType, nextAlarmDate, insertingDate, days) ")
sb.append(" VALUES (?, ?, ?, ?, ?); ")

val statement = compileStatement(sb.toString())
statement.bindLong(1, alarmData.taskId)
statement.bindLong(2, alarmData.repeatType.toLong())
statement.bindString(3, alarmData.nextAlarmDate.orEmpty())
statement.bindString(4, Calendar.getInstance().toDateTimeString())
statement.bindString(5, alarmData.days.orEmpty())

insert(statement)
}

override fun update(alarmData: AlarmData): Result<Unit?> = runCatching {
val sql = StringBuilder()
sql.append(" UPDATE Alarm SET ")
sql.append(" repeatType = ?, ")
sql.append(" nextAlarmDate = ?, ")
sql.append(" days = ? ")
sql.append(" WHERE id = ? ")

val statement = compileStatement(sql.toString())
statement.bindLong(1, alarmData.repeatType.toLong())
statement.bindString(2, alarmData.nextAlarmDate ?: "")
statement.bindString(3, alarmData.days ?: "")
statement.bindLong(4, alarmData.id)

update(statement)
}

private fun buildFromCursor(cursor: Cursor) = AlarmData(
id = getLong(cursor, "id") ?: Entity.NO_ID,
taskId = getLong(cursor, "fkTaskId") ?: Entity.NO_ID,
repeatType = getInt(cursor, "repeatType") ?: RepeatType.NOT_REPEAT.ordinal,
nextAlarmDate = getString(cursor, "nextAlarmDate"),
insertingDate = getString(cursor, "insertingDate"),
days = getString(cursor, "days"),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,35 @@ internal class AlarmRepositoryImpl(
private val alarmDataToAlarmMapper: AlarmDataToAlarmMapper,
private val alarmToAlarmDataMapper: AlarmToAlarmDataMapper,
) : AlarmRepository {
override suspend fun getAlarmByTaskId(taskId: Long): Result<Alarm?> =
runCatching {
val alarmData = alarmLocalDataSource.getAlarmByTask(taskId).getOrNull()
return@runCatching alarmData?.run { alarmDataToAlarmMapper.map(this) }
override suspend fun getAlarmByTaskId(taskId: Long): Result<Alarm?> = runCatching {
val alarmData = alarmLocalDataSource.getAlarmByTask(taskId).getOrNull()
return@runCatching alarmData?.run { alarmDataToAlarmMapper.map(this) }
}

override suspend fun getAlarmsByTaskIds(taskIds: List<Long>): Result<Map<Long, Alarm>> = runCatching {
if (taskIds.isEmpty()) {
return@runCatching emptyMap()
}

val alarms = alarmLocalDataSource.getAlarmsByTaskIds(taskIds).getOrThrow()
.mapNotNull { alarmData ->
val alarm = alarmDataToAlarmMapper.map(alarmData) ?: return@mapNotNull null
alarmData.taskId to alarm
}

return@runCatching alarms.toMap()
}

override suspend fun deleteAlarmByTask(taskId: Long): Result<Unit?> {
return alarmLocalDataSource.deleteByTask(taskId)
}

override suspend fun save(
alarm: Alarm,
taskId: Long,
): Result<Unit?> =
runCatching {
val alarmData = alarmToAlarmDataMapper.map(alarm, taskId)
alarmLocalDataSource.save(alarmData).getOrThrow()
return@runCatching
}
): Result<Unit?> = runCatching {
val alarmData = alarmToAlarmDataMapper.map(alarm, taskId)
alarmLocalDataSource.save(alarmData).getOrThrow()
return@runCatching
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ internal class DeleteAlarmUseCaseImpl(
private val alarmRepository: AlarmRepository,
private val cancelAlarmScheduleUseCase: CancelAlarmScheduleUseCase,
) : DeleteAlarmUseCase {
override suspend operator fun invoke(taskId: Long): Result<Unit?> =
runCatching {
alarmRepository.deleteAlarmByTask(taskId).getOrThrow()
cancelAlarmScheduleUseCase(taskId)
}
override suspend operator fun invoke(taskId: Long): Result<Unit?> = runCatching {
alarmRepository.deleteAlarmByTask(taskId).getOrThrow()
cancelAlarmScheduleUseCase(taskId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ internal class SaveAlarmUseCaseImpl(
override suspend operator fun invoke(
alarm: Alarm,
taskId: Long,
): Result<Unit?> =
runCatching {
alarmRepository.save(alarm, taskId).getOrThrow()
cancelAlarmScheduleUseCase(taskId)
scheduleAlarmUseCase(alarm, taskId)
}
): Result<Unit?> = runCatching {
alarmRepository.save(alarm, taskId).getOrThrow()
cancelAlarmScheduleUseCase(taskId)
scheduleAlarmUseCase(alarm, taskId)
}
}
Loading