From 6fe81750128e338e149c0318f8f8ddba4429a62c Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 3 May 2025 01:32:23 -0500 Subject: [PATCH] Prevent renaming or deleting the default list --- .../java/org/tasks/compose/DeleteButton.kt | 5 +++- .../MicrosoftListSettingsActivityViewModel.kt | 25 ++++++++++++++----- .../tasks/sync/microsoft/MicrosoftService.kt | 9 ++++++- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/tasks/compose/DeleteButton.kt b/app/src/main/java/org/tasks/compose/DeleteButton.kt index f7bd9422d..8239ad3db 100644 --- a/app/src/main/java/org/tasks/compose/DeleteButton.kt +++ b/app/src/main/java/org/tasks/compose/DeleteButton.kt @@ -31,7 +31,10 @@ fun DeleteButton( PromptAction( showDialog = promptDelete, title = stringResource(id = R.string.delete_tag_confirmation, title), - onAction = { scope.launch { onDelete() } }, + onAction = { + scope.launch { onDelete() } + promptDelete = false + }, onCancel = { promptDelete = false }, ) } diff --git a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt index 0542136d2..1736bc4cf 100644 --- a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt +++ b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftListSettingsActivityViewModel.kt @@ -38,12 +38,14 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor( val list: CaldavCalendar? = savedStateHandle[BaseCaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR] + private suspend fun service(): MicrosoftService = + httpClientFactory.getMicrosoftService(account) + suspend fun createList(displayName: String) { _viewState.update { it.copy(requestInFlight = true) } - val microsoftService = httpClientFactory.getMicrosoftService(account) val taskList = TaskLists.TaskList(displayName = displayName) try { - val result = microsoftService.createList(taskList) + val result = service().createList(taskList) val list = CaldavCalendar( account = this@MicrosoftListSettingsActivityViewModel.account.uuid ).apply { @@ -58,9 +60,11 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor( suspend fun deleteList() { _viewState.update { it.copy(requestInFlight = true) } - val microsoftService = httpClientFactory.getMicrosoftService(account) try { - val result = microsoftService.deleteList(list?.uuid!!) + if (isDefault()) { + throw IllegalArgumentException("The default list cannot be deleted") + } + val result = service().deleteList(list?.uuid!!) taskDeleter.delete(list) _viewState.update { it.copy(deleted = true) } } catch (e: Exception) { @@ -70,10 +74,12 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor( suspend fun updateList(displayName: String) { _viewState.update { it.copy(requestInFlight = true) } - val microsoftService = httpClientFactory.getMicrosoftService(account) val taskList = TaskLists.TaskList(displayName = displayName) try { - val result = microsoftService.updateList(list?.uuid!!, taskList) + if (isDefault()) { + throw IllegalArgumentException("The default list cannot be renamed") + } + val result = service().updateList(list?.uuid!!, taskList) result.applyTo(list) caldavDao.update(list) _viewState.update { it.copy(result = list) } @@ -95,4 +101,11 @@ class MicrosoftListSettingsActivityViewModel @Inject constructor( ) } } + + private suspend fun isDefault(): Boolean = try { + service().getList(list?.uuid!!).wellknownListName == "defaultList" + } catch (e: Exception) { + Timber.e(e) + false + } } diff --git a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftService.kt b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftService.kt index 1eb246679..5e27fc42f 100644 --- a/app/src/main/java/org/tasks/sync/microsoft/MicrosoftService.kt +++ b/app/src/main/java/org/tasks/sync/microsoft/MicrosoftService.kt @@ -78,4 +78,11 @@ class MicrosoftService( suspend fun deleteChecklistItem(listId: String, taskId: String, checklistItemId: String) = client.delete("$baseUrl/lists/$listId/tasks/$taskId/checklistItems/$checklistItemId") -} \ No newline at end of file + + suspend fun getList(listId: String): TaskLists.TaskList = + client + .get("$baseUrl/lists/$listId") { + contentType(ContentType.Application.Json) + } + .body() +}