Skip to content

Commit 7bf6ff0

Browse files
committed
feat: implement methods and network operation to edit the password link
1 parent d1d451b commit 7bf6ff0

11 files changed

Lines changed: 163 additions & 4 deletions

File tree

owncloudApp/src/main/java/com/owncloud/android/dependecyinjection/UseCaseModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ import com.owncloud.android.domain.files.usecases.SortFilesWithSyncInfoUseCase
8181
import com.owncloud.android.domain.files.usecases.UpdateAlreadyDownloadedFilesPathUseCase
8282
import com.owncloud.android.domain.links.usecases.AddLinkUseCase
8383
import com.owncloud.android.domain.links.usecases.EditLinkUseCase
84+
import com.owncloud.android.domain.links.usecases.EditPasswordLinkUseCase
8485
import com.owncloud.android.domain.links.usecases.RemoveLinkUseCase
8586
import com.owncloud.android.domain.members.usecases.AddMemberUseCase
8687
import com.owncloud.android.domain.members.usecases.EditMemberUseCase
@@ -323,5 +324,6 @@ val useCaseModule = module {
323324
// Links
324325
factoryOf(::AddLinkUseCase)
325326
factoryOf(::EditLinkUseCase)
327+
factoryOf(::EditPasswordLinkUseCase)
326328
factoryOf(::RemoveLinkUseCase)
327329
}

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/AddPublicLinkFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ class AddPublicLinkFragment: Fragment(), SetPasswordDialogFragment.SetPasswordLi
287287
}
288288

289289
if (it.hasPassword) {
290-
spaceLinksViewModel.onPasswordSelected(null, true)
290+
spaceLinksViewModel.onPasswordSelected(password = null, hasPassword = true, wasPasswordChanged = false)
291291
}
292292

293293
it.expirationDateTime?.let { expirationDate ->

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SpaceLinksViewModel.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.owncloud.android.domain.capabilities.usecases.GetStoredCapabilitiesUs
2828
import com.owncloud.android.domain.links.model.OCLinkType
2929
import com.owncloud.android.domain.links.usecases.AddLinkUseCase
3030
import com.owncloud.android.domain.links.usecases.EditLinkUseCase
31+
import com.owncloud.android.domain.links.usecases.EditPasswordLinkUseCase
3132
import com.owncloud.android.domain.links.usecases.RemoveLinkUseCase
3233
import com.owncloud.android.domain.spaces.model.OCSpace
3334
import com.owncloud.android.domain.utils.Event
@@ -44,6 +45,7 @@ import kotlinx.coroutines.launch
4445
class SpaceLinksViewModel(
4546
private val addLinkUseCase: AddLinkUseCase,
4647
private val editLinkUseCase: EditLinkUseCase,
48+
private val editPasswordLinkUseCase: EditPasswordLinkUseCase,
4749
private val getStoredCapabilitiesUseCase: GetStoredCapabilitiesUseCase,
4850
private val removeLinkUseCase: RemoveLinkUseCase,
4951
private val accountName: String,
@@ -80,8 +82,8 @@ class SpaceLinksViewModel(
8082
_addPublicLinkUIState.update { it?.copy(selectedExpirationDate = expirationDate) }
8183
}
8284

83-
fun onPasswordSelected(password: String?, hasPassword: Boolean) {
84-
_addPublicLinkUIState.update { it?.copy(selectedPassword = password, hasPassword = hasPassword) }
85+
fun onPasswordSelected(password: String?, hasPassword: Boolean, wasPasswordChanged: Boolean = true) {
86+
_addPublicLinkUIState.update { it?.copy(selectedPassword = password, hasPassword = hasPassword, wasPasswordChanged = wasPasswordChanged) }
8587
}
8688

8789
fun createPublicLink(displayName: String) {
@@ -130,6 +132,16 @@ class SpaceLinksViewModel(
130132
expirationDate = _addPublicLinkUIState.value?.selectedExpirationDate,
131133
)
132134
)
135+
if (_addPublicLinkUIState.value?.wasPasswordChanged == true) {
136+
viewModelScope.launch(coroutineDispatcherProvider.io) {
137+
editPasswordLinkUseCase(EditPasswordLinkUseCase.Params(
138+
accountName = accountName,
139+
spaceId = space.id,
140+
linkId = linkId,
141+
password = _addPublicLinkUIState.value?.selectedPassword
142+
))
143+
}
144+
}
133145
}
134146
}
135147

@@ -151,6 +163,7 @@ class SpaceLinksViewModel(
151163
val selectedPermission: OCLinkType? = null,
152164
val selectedExpirationDate: String? = null,
153165
val selectedPassword: String? = null,
154-
val hasPassword: Boolean = false
166+
val hasPassword: Boolean = false,
167+
val wasPasswordChanged: Boolean = false
155168
)
156169
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* ownCloud Android client application
3+
*
4+
* @author Jorge Aguado Recio
5+
*
6+
* Copyright (C) 2026 ownCloud GmbH.
7+
*
8+
* This program is free software: you can redistribute it and/or modify
9+
* it under the terms of the GNU General Public License version 2,
10+
* as published by the Free Software Foundation.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
21+
package com.owncloud.android.lib.resources.links
22+
23+
import com.owncloud.android.lib.common.OwnCloudClient
24+
import com.owncloud.android.lib.common.http.HttpConstants
25+
import com.owncloud.android.lib.common.http.HttpConstants.CONTENT_TYPE_JSON
26+
import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod
27+
import com.owncloud.android.lib.common.operations.RemoteOperation
28+
import com.owncloud.android.lib.common.operations.RemoteOperationResult
29+
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode
30+
import okhttp3.MediaType.Companion.toMediaType
31+
import okhttp3.RequestBody.Companion.toRequestBody
32+
import org.json.JSONObject
33+
import timber.log.Timber
34+
import java.net.URL
35+
36+
class EditRemotePasswordLinkOperation(
37+
private val spaceId: String,
38+
private val linkId: String,
39+
private val password: String?
40+
): RemoteOperation<Unit>() {
41+
override fun run(client: OwnCloudClient): RemoteOperationResult<Unit> {
42+
var result: RemoteOperationResult<Unit>
43+
try {
44+
val uriBuilder = client.baseUri.buildUpon().apply {
45+
appendEncodedPath(GRAPH_API_DRIVES_PATH)
46+
appendEncodedPath(spaceId)
47+
appendEncodedPath(GRAPH_API_ROOT_PERMISSIONS_PATH)
48+
appendEncodedPath(linkId)
49+
appendEncodedPath(GRAPH_API_SET_PASSWORD_PATH)
50+
}
51+
52+
val requestBody = JSONObject().apply {
53+
put(PASSWORD_BODY_PARAM, password)
54+
}.toString().toRequestBody(CONTENT_TYPE_JSON.toMediaType())
55+
56+
val postMethod = PostMethod(URL(uriBuilder.build().toString()), requestBody)
57+
58+
val status = client.executeHttpMethod(postMethod)
59+
60+
val response = postMethod.getResponseBodyAsString()
61+
62+
if (status == HttpConstants.HTTP_OK) {
63+
Timber.d("Successful response: $response")
64+
result = RemoteOperationResult(ResultCode.OK)
65+
Timber.d("Edit password public link operation completed and parsed to ${result.data}")
66+
} else {
67+
result = RemoteOperationResult(postMethod)
68+
Timber.e("Failed response while editing password public link; status code: $status, response: $response")
69+
}
70+
} catch (e: Exception) {
71+
result = RemoteOperationResult(e)
72+
Timber.e(e, "Exception while editing password public link")
73+
}
74+
return result
75+
}
76+
77+
companion object {
78+
private const val GRAPH_API_DRIVES_PATH = "graph/v1beta1/drives/"
79+
private const val GRAPH_API_ROOT_PERMISSIONS_PATH = "root/permissions"
80+
private const val GRAPH_API_SET_PASSWORD_PATH = "setPassword"
81+
private const val PASSWORD_BODY_PARAM = "password"
82+
}
83+
}

owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/links/services/LinksService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ import com.owncloud.android.lib.resources.Service
2626
interface LinksService: Service {
2727
fun addLink(spaceId: String, displayName: String, type: String, expirationDate: String?, password: String?): RemoteOperationResult<Unit>
2828
fun editLink(spaceId: String, linkId: String, displayName: String, type: String, expirationDate: String?): RemoteOperationResult<Unit>
29+
fun editPasswordLink(spaceId: String, linkId: String, password: String?): RemoteOperationResult<Unit>
2930
fun removeLink(spaceId: String, linkId: String): RemoteOperationResult<Unit>
3031
}

owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/links/services/OCLinksService.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.owncloud.android.lib.common.OwnCloudClient
2424
import com.owncloud.android.lib.common.operations.RemoteOperationResult
2525
import com.owncloud.android.lib.resources.links.AddRemoteLinkOperation
2626
import com.owncloud.android.lib.resources.links.EditRemoteLinkOperation
27+
import com.owncloud.android.lib.resources.links.EditRemotePasswordLinkOperation
2728
import com.owncloud.android.lib.resources.links.RemoveRemoteLinkOperation
2829

2930
class OCLinksService(override val client: OwnCloudClient) : LinksService {
@@ -58,6 +59,13 @@ class OCLinksService(override val client: OwnCloudClient) : LinksService {
5859
expirationDate = expirationDate
5960
).execute(client)
6061

62+
override fun editPasswordLink(spaceId: String, linkId: String, password: String?): RemoteOperationResult<Unit> =
63+
EditRemotePasswordLinkOperation(
64+
spaceId = spaceId,
65+
linkId = linkId,
66+
password = password
67+
).execute(client)
68+
6169
override fun removeLink(spaceId: String, linkId: String): RemoteOperationResult<Unit> =
6270
RemoveRemoteLinkOperation(
6371
spaceId = spaceId,

owncloudData/src/main/java/com/owncloud/android/data/links/datasources/RemoteLinksDataSource.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ import com.owncloud.android.domain.links.model.OCLinkType
2525
interface RemoteLinksDataSource {
2626
fun addLink(accountName: String, spaceId: String, displayName: String, type: OCLinkType, expirationDate: String?, password: String?)
2727
fun editLink(accountName: String, spaceId: String, linkId: String, displayName: String, type: OCLinkType, expirationDate: String?)
28+
fun editPasswordLink(accountName: String, spaceId: String, linkId: String, password: String?)
2829
fun removeLink(accountName: String, spaceId: String, linkId: String)
2930
}

owncloudData/src/main/java/com/owncloud/android/data/links/datasources/implementation/OCRemoteLinksDataSource.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ class OCRemoteLinksDataSource(
4141
}
4242
}
4343

44+
override fun editPasswordLink(accountName: String, spaceId: String, linkId: String, password: String?) {
45+
executeRemoteOperation {
46+
clientManager.getLinksService(accountName).editPasswordLink(spaceId, linkId, password)
47+
}
48+
}
49+
4450
override fun removeLink(accountName: String, spaceId: String, linkId: String) {
4551
executeRemoteOperation {
4652
clientManager.getLinksService(accountName).removeLink(spaceId, linkId)

owncloudData/src/main/java/com/owncloud/android/data/links/repository/OCLinksRepository.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ class OCLinksRepository(
3636
remoteLinksDataSource.editLink(accountName, spaceId, linkId, displayName, type, expirationDate)
3737
}
3838

39+
override fun editPasswordLink(accountName: String, spaceId: String, linkId: String, password: String?) {
40+
remoteLinksDataSource.editPasswordLink(accountName, spaceId, linkId, password)
41+
}
42+
3943
override fun removeLink(accountName: String, spaceId: String, linkId: String) {
4044
remoteLinksDataSource.removeLink(accountName, spaceId, linkId)
4145
}

owncloudDomain/src/main/java/com/owncloud/android/domain/links/LinksRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ import com.owncloud.android.domain.links.model.OCLinkType
2525
interface LinksRepository {
2626
fun addLink(accountName: String, spaceId: String, displayName: String, type: OCLinkType, expirationDate: String?, password: String?)
2727
fun editLink(accountName: String, spaceId: String, linkId: String, displayName: String, type: OCLinkType, expirationDate: String?)
28+
fun editPasswordLink(accountName: String, spaceId: String, linkId: String, password: String?)
2829
fun removeLink(accountName: String, spaceId: String, linkId: String)
2930
}

0 commit comments

Comments
 (0)