Skip to content

Commit 5b027be

Browse files
committed
Create RoomDirectoryAPI, and handle deletion of alias
1 parent 360c6d0 commit 5b027be

File tree

12 files changed

+168
-36
lines changed

12 files changed

+168
-36
lines changed

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt

+5
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ interface RoomService {
122122
searchOnServer: Boolean,
123123
callback: MatrixCallback<Optional<String>>): Cancelable
124124

125+
/**
126+
* Delete a room alias
127+
*/
128+
suspend fun deleteRoomAlias(roomAlias: String)
129+
125130
/**
126131
* Return a live data of all local changes membership that happened since the session has been opened.
127132
* It allows you to track this in your client to known what is currently being processed by the SDK.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright 2020 The Matrix.org Foundation C.I.C.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.session.directory
18+
19+
import org.matrix.android.sdk.internal.network.NetworkConstants
20+
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasBody
21+
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
22+
import retrofit2.Call
23+
import retrofit2.http.Body
24+
import retrofit2.http.DELETE
25+
import retrofit2.http.GET
26+
import retrofit2.http.PUT
27+
import retrofit2.http.Path
28+
29+
internal interface DirectoryAPI {
30+
/**
31+
* Get the room ID associated to the room alias.
32+
*
33+
* @param roomAlias the room alias.
34+
*/
35+
@GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
36+
fun getRoomIdByAlias(@Path("roomAlias") roomAlias: String): Call<RoomAliasDescription>
37+
38+
/**
39+
* Add alias to the room.
40+
* @param roomAlias the room alias.
41+
*/
42+
// TODO Remove (https://github.com/matrix-org/matrix-doc/blob/rav/proposal/alt_canonical_aliases/proposals/2432-revised-alias-publishing.md)
43+
@PUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
44+
fun addRoomAlias(@Path("roomAlias") roomAlias: String,
45+
@Body body: AddRoomAliasBody): Call<Unit>
46+
47+
/**
48+
* Delete a room aliases
49+
* @param roomAlias the room alias.
50+
*/
51+
@DELETE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
52+
fun deleteRoomAlias(@Path("roomAlias") roomAlias: String): Call<Unit>
53+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt

+6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.matrix.android.sdk.api.util.toOptional
3333
import org.matrix.android.sdk.internal.database.mapper.asDomain
3434
import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntityFields
3535
import org.matrix.android.sdk.internal.di.SessionDatabase
36+
import org.matrix.android.sdk.internal.session.room.alias.DeleteRoomAliasTask
3637
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
3738
import org.matrix.android.sdk.internal.session.room.create.CreateRoomTask
3839
import org.matrix.android.sdk.internal.session.room.membership.RoomChangeMembershipStateDataSource
@@ -53,6 +54,7 @@ internal class DefaultRoomService @Inject constructor(
5354
private val markAllRoomsReadTask: MarkAllRoomsReadTask,
5455
private val updateBreadcrumbsTask: UpdateBreadcrumbsTask,
5556
private val roomIdByAliasTask: GetRoomIdByAliasTask,
57+
private val deleteRoomAliasTask: DeleteRoomAliasTask,
5658
private val roomGetter: RoomGetter,
5759
private val roomSummaryDataSource: RoomSummaryDataSource,
5860
private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource,
@@ -125,6 +127,10 @@ internal class DefaultRoomService @Inject constructor(
125127
.executeBy(taskExecutor)
126128
}
127129

130+
override suspend fun deleteRoomAlias(roomAlias: String) {
131+
deleteRoomAliasTask.execute(DeleteRoomAliasTask.Params(roomAlias))
132+
}
133+
128134
override fun getChangeMembershipsLive(): LiveData<Map<String, ChangeMembershipState>> {
129135
return roomChangeMembershipStateDataSource.getLiveStates()
130136
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomAPI.kt

-19
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsRe
2323
import org.matrix.android.sdk.api.session.room.model.thirdparty.ThirdPartyProtocol
2424
import org.matrix.android.sdk.api.util.JsonDict
2525
import org.matrix.android.sdk.internal.network.NetworkConstants
26-
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasBody
2726
import org.matrix.android.sdk.internal.session.room.alias.GetAliasesResponse
28-
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
2927
import org.matrix.android.sdk.internal.session.room.create.CreateRoomBody
3028
import org.matrix.android.sdk.internal.session.room.create.CreateRoomResponse
3129
import org.matrix.android.sdk.internal.session.room.create.JoinRoomResponse
@@ -321,23 +319,6 @@ internal interface RoomAPI {
321319
@Path("eventId") eventId: String,
322320
@Body body: ReportContentBody): Call<Unit>
323321

324-
/**
325-
* Get the room ID associated to the room alias.
326-
*
327-
* @param roomAlias the room alias.
328-
*/
329-
@GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
330-
fun getRoomIdByAlias(@Path("roomAlias") roomAlias: String): Call<RoomAliasDescription>
331-
332-
/**
333-
* Add alias to the room.
334-
* @param roomAlias the room alias.
335-
*/
336-
// TODO Remove (https://github.com/matrix-org/matrix-doc/blob/rav/proposal/alt_canonical_aliases/proposals/2432-revised-alias-publishing.md)
337-
@PUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
338-
fun addRoomAlias(@Path("roomAlias") roomAlias: String,
339-
@Body body: AddRoomAliasBody): Call<Unit>
340-
341322
/**
342323
* Get local aliases of this room
343324
*/

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/RoomModule.kt

+13
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ import org.matrix.android.sdk.api.session.room.RoomDirectoryService
2626
import org.matrix.android.sdk.api.session.room.RoomService
2727
import org.matrix.android.sdk.internal.session.DefaultFileService
2828
import org.matrix.android.sdk.internal.session.SessionScope
29+
import org.matrix.android.sdk.internal.session.directory.DirectoryAPI
2930
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask
3031
import org.matrix.android.sdk.internal.session.room.alias.DefaultAddRoomAliasTask
32+
import org.matrix.android.sdk.internal.session.room.alias.DefaultDeleteRoomAliasTask
3133
import org.matrix.android.sdk.internal.session.room.alias.DefaultGetRoomIdByAliasTask
3234
import org.matrix.android.sdk.internal.session.room.alias.DefaultGetRoomLocalAliasesTask
35+
import org.matrix.android.sdk.internal.session.room.alias.DeleteRoomAliasTask
3336
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
3437
import org.matrix.android.sdk.internal.session.room.alias.GetRoomLocalAliasesTask
3538
import org.matrix.android.sdk.internal.session.room.create.CreateRoomTask
@@ -92,6 +95,13 @@ internal abstract class RoomModule {
9295
return retrofit.create(RoomAPI::class.java)
9396
}
9497

98+
@Provides
99+
@JvmStatic
100+
@SessionScope
101+
fun providesDirectoryAPI(retrofit: Retrofit): DirectoryAPI {
102+
return retrofit.create(DirectoryAPI::class.java)
103+
}
104+
95105
@Provides
96106
@JvmStatic
97107
fun providesParser(): Parser {
@@ -189,6 +199,9 @@ internal abstract class RoomModule {
189199
@Binds
190200
abstract fun bindAddRoomAliasTask(task: DefaultAddRoomAliasTask): AddRoomAliasTask
191201

202+
@Binds
203+
abstract fun bindDeleteRoomAliasTask(task: DefaultDeleteRoomAliasTask): DeleteRoomAliasTask
204+
192205
@Binds
193206
abstract fun bindSendTypingTask(task: DefaultSendTypingTask): SendTypingTask
194207

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/AddRoomAliasTask.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616

1717
package org.matrix.android.sdk.internal.session.room.alias
1818

19+
import org.greenrobot.eventbus.EventBus
1920
import org.matrix.android.sdk.internal.network.executeRequest
20-
import org.matrix.android.sdk.internal.session.room.RoomAPI
21+
import org.matrix.android.sdk.internal.session.directory.DirectoryAPI
2122
import org.matrix.android.sdk.internal.task.Task
22-
import org.greenrobot.eventbus.EventBus
2323
import javax.inject.Inject
2424

2525
internal interface AddRoomAliasTask : Task<AddRoomAliasTask.Params, Unit> {
@@ -30,13 +30,13 @@ internal interface AddRoomAliasTask : Task<AddRoomAliasTask.Params, Unit> {
3030
}
3131

3232
internal class DefaultAddRoomAliasTask @Inject constructor(
33-
private val roomAPI: RoomAPI,
33+
private val directoryAPI: DirectoryAPI,
3434
private val eventBus: EventBus
3535
) : AddRoomAliasTask {
3636

3737
override suspend fun execute(params: AddRoomAliasTask.Params) {
3838
executeRequest<Unit>(eventBus) {
39-
apiCall = roomAPI.addRoomAlias(
39+
apiCall = directoryAPI.addRoomAlias(
4040
roomAlias = params.roomAlias,
4141
body = AddRoomAliasBody(
4242
roomId = params.roomId
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2020 The Matrix.org Foundation C.I.C.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.session.room.alias
18+
19+
import org.greenrobot.eventbus.EventBus
20+
import org.matrix.android.sdk.internal.network.executeRequest
21+
import org.matrix.android.sdk.internal.session.directory.DirectoryAPI
22+
import org.matrix.android.sdk.internal.task.Task
23+
import javax.inject.Inject
24+
25+
internal interface DeleteRoomAliasTask : Task<DeleteRoomAliasTask.Params, Unit> {
26+
data class Params(
27+
val roomAlias: String
28+
)
29+
}
30+
31+
internal class DefaultDeleteRoomAliasTask @Inject constructor(
32+
private val directoryAPI: DirectoryAPI,
33+
private val eventBus: EventBus
34+
) : DeleteRoomAliasTask {
35+
36+
override suspend fun execute(params: DeleteRoomAliasTask.Params) {
37+
executeRequest<Unit>(eventBus) {
38+
apiCall = directoryAPI.deleteRoomAlias(
39+
roomAlias = params.roomAlias
40+
)
41+
}
42+
}
43+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/GetRoomIdByAliasTask.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
2525
import org.matrix.android.sdk.internal.database.query.findByAlias
2626
import org.matrix.android.sdk.internal.di.SessionDatabase
2727
import org.matrix.android.sdk.internal.network.executeRequest
28-
import org.matrix.android.sdk.internal.session.room.RoomAPI
28+
import org.matrix.android.sdk.internal.session.directory.DirectoryAPI
2929
import org.matrix.android.sdk.internal.task.Task
3030
import javax.inject.Inject
3131

@@ -38,7 +38,7 @@ internal interface GetRoomIdByAliasTask : Task<GetRoomIdByAliasTask.Params, Opti
3838

3939
internal class DefaultGetRoomIdByAliasTask @Inject constructor(
4040
@SessionDatabase private val monarchy: Monarchy,
41-
private val roomAPI: RoomAPI,
41+
private val directoryAPI: DirectoryAPI,
4242
private val eventBus: EventBus
4343
) : GetRoomIdByAliasTask {
4444

@@ -53,7 +53,7 @@ internal class DefaultGetRoomIdByAliasTask @Inject constructor(
5353
} else {
5454
roomId = tryOrNull("## Failed to get roomId from alias") {
5555
executeRequest<RoomAliasDescription>(eventBus) {
56-
apiCall = roomAPI.getRoomIdByAlias(params.roomAlias)
56+
apiCall = directoryAPI.getRoomIdByAlias(params.roomAlias)
5757
}
5858
}?.roomId
5959
Optional.from(roomId)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomTask.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.matrix.android.sdk.internal.database.query.where
3333
import org.matrix.android.sdk.internal.di.SessionDatabase
3434
import org.matrix.android.sdk.internal.di.UserId
3535
import org.matrix.android.sdk.internal.network.executeRequest
36+
import org.matrix.android.sdk.internal.session.directory.DirectoryAPI
3637
import org.matrix.android.sdk.internal.session.room.RoomAPI
3738
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
3839
import org.matrix.android.sdk.internal.session.room.read.SetReadMarkersTask
@@ -47,6 +48,7 @@ internal interface CreateRoomTask : Task<CreateRoomParams, String>
4748

4849
internal class DefaultCreateRoomTask @Inject constructor(
4950
private val roomAPI: RoomAPI,
51+
private val directoryAPI: DirectoryAPI,
5052
@UserId private val userId: String,
5153
@SessionDatabase private val monarchy: Monarchy,
5254
private val directChatsHelper: DirectChatsHelper,
@@ -72,7 +74,7 @@ internal class DefaultCreateRoomTask @Inject constructor(
7274
val fullAlias = "#" + params.roomAliasName + ":" + userId.substringAfter(":")
7375
try {
7476
executeRequest<RoomAliasDescription>(eventBus) {
75-
apiCall = roomAPI.getRoomIdByAlias(fullAlias)
77+
apiCall = directoryAPI.getRoomIdByAlias(fullAlias)
7678
}
7779
} catch (throwable: Throwable) {
7880
if (throwable is Failure.ServerError && throwable.httpCode == 404) {

vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt

+22-3
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616

1717
package im.vector.app.features.roomprofile.alias
1818

19+
import android.content.DialogInterface
1920
import android.os.Bundle
2021
import android.view.View
22+
import androidx.appcompat.app.AlertDialog
2123
import androidx.core.view.isVisible
2224
import com.airbnb.mvrx.args
2325
import com.airbnb.mvrx.fragmentViewModel
2426
import com.airbnb.mvrx.withState
2527
import im.vector.app.R
28+
import im.vector.app.core.dialogs.withColoredButton
2629
import im.vector.app.core.extensions.cleanup
2730
import im.vector.app.core.extensions.configureWith
2831
import im.vector.app.core.extensions.exhaustive
@@ -59,7 +62,7 @@ class RoomAliasFragment @Inject constructor(
5962
viewModel.observeViewEvents {
6063
when (it) {
6164
is RoomAliasViewEvents.Failure -> showFailure(it.throwable)
62-
RoomAliasViewEvents.Success -> showSuccess()
65+
RoomAliasViewEvents.Success -> showSuccess()
6366
}.exhaustive
6467
}
6568
}
@@ -91,7 +94,15 @@ class RoomAliasFragment @Inject constructor(
9194
}
9295

9396
override fun removeAlias(altAlias: String) {
94-
viewModel.handle(RoomAliasAction.RemoveAlias(altAlias))
97+
AlertDialog.Builder(requireContext())
98+
.setTitle(R.string.dialog_title_confirmation)
99+
.setMessage(getString(R.string.room_alias_delete_confirmation, altAlias))
100+
.setNegativeButton(R.string.cancel, null)
101+
.setPositiveButton(R.string.delete) { _, _ ->
102+
viewModel.handle(RoomAliasAction.RemoveAlias(altAlias))
103+
}
104+
.show()
105+
.withColoredButton(DialogInterface.BUTTON_POSITIVE)
95106
}
96107

97108
override fun setCanonicalAlias(alias: String) {
@@ -107,6 +118,14 @@ class RoomAliasFragment @Inject constructor(
107118
}
108119

109120
override fun removeLocalAlias(alias: String) {
110-
viewModel.handle(RoomAliasAction.RemoveLocalAlias(alias))
121+
AlertDialog.Builder(requireContext())
122+
.setTitle(R.string.dialog_title_confirmation)
123+
.setMessage(getString(R.string.room_alias_delete_confirmation, alias))
124+
.setNegativeButton(R.string.cancel, null)
125+
.setPositiveButton(R.string.delete) { _, _ ->
126+
viewModel.handle(RoomAliasAction.RemoveLocalAlias(alias))
127+
}
128+
.show()
129+
.withColoredButton(DialogInterface.BUTTON_POSITIVE)
111130
}
112131
}

vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt

+15-6
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
140140

141141
override fun handle(action: RoomAliasAction) {
142142
when (action) {
143-
is RoomAliasAction.AddAlias -> handleAddAlias(action)
144-
is RoomAliasAction.RemoveAlias -> handleRemoveAlias(action)
143+
is RoomAliasAction.AddAlias -> handleAddAlias(action)
144+
is RoomAliasAction.RemoveAlias -> handleRemoveAlias(action)
145145
is RoomAliasAction.SetCanonicalAlias -> handleSetCanonicalAlias(action)
146-
RoomAliasAction.UnSetCanonicalAlias -> handleUnsetCanonicalAlias()
147-
is RoomAliasAction.AddLocalAlias -> handleAddLocalAlias(action)
148-
is RoomAliasAction.RemoveLocalAlias -> handleRemoveLocalAlias(action)
146+
RoomAliasAction.UnSetCanonicalAlias -> handleUnsetCanonicalAlias()
147+
is RoomAliasAction.AddLocalAlias -> handleAddLocalAlias(action)
148+
is RoomAliasAction.RemoveLocalAlias -> handleRemoveLocalAlias(action)
149149
}.exhaustive
150150
}
151151

@@ -154,7 +154,16 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
154154
}
155155

156156
private fun handleRemoveAlias(action: RoomAliasAction.RemoveAlias) {
157-
TODO("Not yet implemented")
157+
setState {
158+
copy(isLoading = true)
159+
}
160+
viewModelScope.launch {
161+
runCatching { session.deleteRoomAlias(action.alias) }
162+
.onFailure { _viewEvents.post(RoomAliasViewEvents.Failure(it)) }
163+
setState {
164+
copy(isLoading = false)
165+
}
166+
}
158167
}
159168

160169
private fun handleSetCanonicalAlias(action: RoomAliasAction.SetCanonicalAlias) {

vector/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,7 @@
10281028
<string name="room_alias_published_alias_subtitle">Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.</string>
10291029
<string name="room_alias_main_address_hint">Main address</string>
10301030
<string name="room_alias_published_other">Other published addresses:</string>
1031+
<string name="room_alias_delete_confirmation">Delete the address \"%1$s\"?</string>
10311032
<!-- Parameter will be the url of the homeserver, ex: matrix.org -->
10321033
<string name="room_alias_publish">Publish this room to the public in %1$s\'s room directory?</string>
10331034
<string name="room_alias_address_empty">No other published addresses yet, add one below</string>

0 commit comments

Comments
 (0)