Skip to content

Commit 05b8bbf

Browse files
committed
Create a dedicated screen to manage room alias (#2428) - WIP
1 parent 3575cad commit 05b8bbf

25 files changed

+718
-39
lines changed

matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt

-8
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,6 @@ class RxRoom(private val room: Room) {
127127
room.updateName(name, it)
128128
}
129129

130-
fun addRoomAlias(alias: String): Completable = completableBuilder<Unit> {
131-
room.addRoomAlias(alias, it)
132-
}
133-
134-
fun updateCanonicalAlias(alias: String): Completable = completableBuilder<Unit> {
135-
room.updateCanonicalAlias(alias, it)
136-
}
137-
138130
fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = completableBuilder<Unit> {
139131
room.updateHistoryReadability(readability, it)
140132
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.api.session.room
1818

1919
import androidx.lifecycle.LiveData
2020
import org.matrix.android.sdk.api.MatrixCallback
21+
import org.matrix.android.sdk.api.session.room.alias.AliasService
2122
import org.matrix.android.sdk.api.session.room.call.RoomCallService
2223
import org.matrix.android.sdk.api.session.room.crypto.RoomCryptoService
2324
import org.matrix.android.sdk.api.session.room.members.MembershipService
@@ -46,6 +47,7 @@ interface Room :
4647
DraftService,
4748
ReadService,
4849
TypingService,
50+
AliasService,
4951
TagsService,
5052
MembershipService,
5153
StateService,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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.api.session.room.alias
18+
19+
interface AliasService {
20+
/**
21+
* Get list of local alias of the room
22+
*/
23+
suspend fun getRoomAliases(): List<String>
24+
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.matrix.android.sdk.api.MatrixCallback
2121
import org.matrix.android.sdk.api.session.crypto.CryptoService
2222
import org.matrix.android.sdk.api.session.events.model.EventType
2323
import org.matrix.android.sdk.api.session.room.Room
24+
import org.matrix.android.sdk.api.session.room.alias.AliasService
2425
import org.matrix.android.sdk.api.session.room.call.RoomCallService
2526
import org.matrix.android.sdk.api.session.room.members.MembershipService
2627
import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -58,6 +59,7 @@ internal class DefaultRoom @Inject constructor(override val roomId: String,
5859
private val roomCallService: RoomCallService,
5960
private val readService: ReadService,
6061
private val typingService: TypingService,
62+
private val aliasService: AliasService,
6163
private val tagsService: TagsService,
6264
private val cryptoService: CryptoService,
6365
private val relationService: RelationService,
@@ -76,6 +78,7 @@ internal class DefaultRoom @Inject constructor(override val roomId: String,
7678
RoomCallService by roomCallService,
7779
ReadService by readService,
7880
TypingService by typingService,
81+
AliasService by aliasService,
7982
TagsService by tagsService,
8083
RelationService by relationService,
8184
MembershipService by roomMembersService,

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

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.session.room.model.thirdparty.ThirdPartyProtoc
2424
import org.matrix.android.sdk.api.util.JsonDict
2525
import org.matrix.android.sdk.internal.network.NetworkConstants
2626
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasBody
27+
import org.matrix.android.sdk.internal.session.room.alias.GetAliasesResponse
2728
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
2829
import org.matrix.android.sdk.internal.session.room.create.CreateRoomBody
2930
import org.matrix.android.sdk.internal.session.room.create.CreateRoomResponse
@@ -332,10 +333,17 @@ internal interface RoomAPI {
332333
* Add alias to the room.
333334
* @param roomAlias the room alias.
334335
*/
336+
// TODO Remove (https://github.com/matrix-org/matrix-doc/blob/rav/proposal/alt_canonical_aliases/proposals/2432-revised-alias-publishing.md)
335337
@PUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}")
336338
fun addRoomAlias(@Path("roomAlias") roomAlias: String,
337339
@Body body: AddRoomAliasBody): Call<Unit>
338340

341+
/**
342+
* Get local aliases of this room
343+
*/
344+
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "org.matrix.msc2432/rooms/{roomId}/aliases")
345+
fun getAliases(@Path("roomId") roomId: String): Call<GetAliasesResponse>
346+
339347
/**
340348
* Inform that the user is starting to type or has stopped typing
341349
*/

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

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.session.room
1919
import org.matrix.android.sdk.api.session.crypto.CryptoService
2020
import org.matrix.android.sdk.api.session.room.Room
2121
import org.matrix.android.sdk.internal.session.SessionScope
22+
import org.matrix.android.sdk.internal.session.room.alias.DefaultAliasService
2223
import org.matrix.android.sdk.internal.session.room.call.DefaultRoomCallService
2324
import org.matrix.android.sdk.internal.session.room.draft.DefaultDraftService
2425
import org.matrix.android.sdk.internal.session.room.membership.DefaultMembershipService
@@ -54,6 +55,7 @@ internal class DefaultRoomFactory @Inject constructor(private val cryptoService:
5455
private val roomCallServiceFactory: DefaultRoomCallService.Factory,
5556
private val readServiceFactory: DefaultReadService.Factory,
5657
private val typingServiceFactory: DefaultTypingService.Factory,
58+
private val aliasServiceFactory: DefaultAliasService.Factory,
5759
private val tagsServiceFactory: DefaultTagsService.Factory,
5860
private val relationServiceFactory: DefaultRelationService.Factory,
5961
private val membershipServiceFactory: DefaultMembershipService.Factory,
@@ -76,6 +78,7 @@ internal class DefaultRoomFactory @Inject constructor(private val cryptoService:
7678
roomCallService = roomCallServiceFactory.create(roomId),
7779
readService = readServiceFactory.create(roomId),
7880
typingService = typingServiceFactory.create(roomId),
81+
aliasService = aliasServiceFactory.create(roomId),
7982
tagsService = tagsServiceFactory.create(roomId),
8083
cryptoService = cryptoService,
8184
relationService = relationServiceFactory.create(roomId),

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

+5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import org.matrix.android.sdk.internal.session.SessionScope
2929
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask
3030
import org.matrix.android.sdk.internal.session.room.alias.DefaultAddRoomAliasTask
3131
import org.matrix.android.sdk.internal.session.room.alias.DefaultGetRoomIdByAliasTask
32+
import org.matrix.android.sdk.internal.session.room.alias.DefaultGetRoomLocalAliasesTask
3233
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
34+
import org.matrix.android.sdk.internal.session.room.alias.GetRoomLocalAliasesTask
3335
import org.matrix.android.sdk.internal.session.room.create.CreateRoomTask
3436
import org.matrix.android.sdk.internal.session.room.create.DefaultCreateRoomTask
3537
import org.matrix.android.sdk.internal.session.room.directory.DefaultGetPublicRoomTask
@@ -181,6 +183,9 @@ internal abstract class RoomModule {
181183
@Binds
182184
abstract fun bindGetRoomIdByAliasTask(task: DefaultGetRoomIdByAliasTask): GetRoomIdByAliasTask
183185

186+
@Binds
187+
abstract fun bindGetRoomLocalAliasesTask(task: DefaultGetRoomLocalAliasesTask): GetRoomLocalAliasesTask
188+
184189
@Binds
185190
abstract fun bindAddRoomAliasTask(task: DefaultAddRoomAliasTask): AddRoomAliasTask
186191

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 com.squareup.inject.assisted.Assisted
20+
import com.squareup.inject.assisted.AssistedInject
21+
import org.matrix.android.sdk.api.session.room.alias.AliasService
22+
23+
internal class DefaultAliasService @AssistedInject constructor(
24+
@Assisted private val roomId: String,
25+
private val getRoomLocalAliasesTask: GetRoomLocalAliasesTask
26+
) : AliasService {
27+
28+
@AssistedInject.Factory
29+
interface Factory {
30+
fun create(roomId: String): AliasService
31+
}
32+
33+
override suspend fun getRoomAliases(): List<String> {
34+
return getRoomLocalAliasesTask.execute(GetRoomLocalAliasesTask.Params(roomId))
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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 com.squareup.moshi.Json
20+
import com.squareup.moshi.JsonClass
21+
22+
@JsonClass(generateAdapter = true)
23+
internal data class GetAliasesResponse(
24+
/**
25+
* The list of aliases currently defined on the local server for the given room
26+
*/
27+
@Json(name = "aliases") val aliases: List<String> = emptyList()
28+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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.room.RoomAPI
22+
import org.matrix.android.sdk.internal.task.Task
23+
import javax.inject.Inject
24+
25+
internal interface GetRoomLocalAliasesTask : Task<GetRoomLocalAliasesTask.Params, List<String>> {
26+
data class Params(
27+
val roomId: String
28+
)
29+
}
30+
31+
internal class DefaultGetRoomLocalAliasesTask @Inject constructor(
32+
private val roomAPI: RoomAPI,
33+
private val eventBus: EventBus
34+
) : GetRoomLocalAliasesTask {
35+
36+
override suspend fun execute(params: GetRoomLocalAliasesTask.Params): List<String> {
37+
// We do not check for "org.matrix.msc2432", so the API may be missing
38+
val response = executeRequest<GetAliasesResponse>(eventBus) {
39+
apiCall = roomAPI.getAliases(roomId = params.roomId)
40+
}
41+
42+
return response.aliases
43+
}
44+
}

vector/src/main/java/im/vector/app/core/di/FragmentModule.kt

+6
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import im.vector.app.features.roomprofile.RoomProfileFragment
8383
import im.vector.app.features.roomprofile.banned.RoomBannedMemberListFragment
8484
import im.vector.app.features.roomprofile.members.RoomMemberListFragment
8585
import im.vector.app.features.roomprofile.settings.RoomSettingsFragment
86+
import im.vector.app.features.roomprofile.alias.RoomAliasFragment
8687
import im.vector.app.features.roomprofile.uploads.RoomUploadsFragment
8788
import im.vector.app.features.roomprofile.uploads.files.RoomUploadsFilesFragment
8889
import im.vector.app.features.roomprofile.uploads.media.RoomUploadsMediaFragment
@@ -363,6 +364,11 @@ interface FragmentModule {
363364
@FragmentKey(RoomSettingsFragment::class)
364365
fun bindRoomSettingsFragment(fragment: RoomSettingsFragment): Fragment
365366

367+
@Binds
368+
@IntoMap
369+
@FragmentKey(RoomAliasFragment::class)
370+
fun bindRoomAliasFragment(fragment: RoomAliasFragment): Fragment
371+
366372
@Binds
367373
@IntoMap
368374
@FragmentKey(RoomMemberProfileFragment::class)

vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt

+6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import im.vector.app.features.room.RequireActiveMembershipViewState
3636
import im.vector.app.features.roomprofile.banned.RoomBannedMemberListFragment
3737
import im.vector.app.features.roomprofile.members.RoomMemberListFragment
3838
import im.vector.app.features.roomprofile.settings.RoomSettingsFragment
39+
import im.vector.app.features.roomprofile.alias.RoomAliasFragment
3940
import im.vector.app.features.roomprofile.uploads.RoomUploadsFragment
4041
import javax.inject.Inject
4142

@@ -100,6 +101,7 @@ class RoomProfileActivity :
100101
when (sharedAction) {
101102
is RoomProfileSharedAction.OpenRoomMembers -> openRoomMembers()
102103
is RoomProfileSharedAction.OpenRoomSettings -> openRoomSettings()
104+
is RoomProfileSharedAction.OpenRoomAlias -> openRoomAlias()
103105
is RoomProfileSharedAction.OpenRoomUploads -> openRoomUploads()
104106
is RoomProfileSharedAction.OpenBannedRoomMembers -> openBannedRoomMembers()
105107
}
@@ -135,6 +137,10 @@ class RoomProfileActivity :
135137
addFragmentToBackstack(R.id.simpleFragmentContainer, RoomSettingsFragment::class.java, roomProfileArgs)
136138
}
137139

140+
private fun openRoomAlias() {
141+
addFragmentToBackstack(R.id.simpleFragmentContainer, RoomAliasFragment::class.java, roomProfileArgs)
142+
}
143+
138144
private fun openRoomMembers() {
139145
addFragmentToBackstack(R.id.simpleFragmentContainer, RoomMemberListFragment::class.java, roomProfileArgs)
140146
}

vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileSharedAction.kt

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import im.vector.app.core.platform.VectorSharedAction
2323
*/
2424
sealed class RoomProfileSharedAction : VectorSharedAction {
2525
object OpenRoomSettings : RoomProfileSharedAction()
26+
object OpenRoomAlias : RoomProfileSharedAction()
2627
object OpenRoomUploads : RoomProfileSharedAction()
2728
object OpenRoomMembers : RoomProfileSharedAction()
2829
object OpenBannedRoomMembers : RoomProfileSharedAction()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright 2020 New Vector Ltd
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 im.vector.app.features.roomprofile.alias
18+
19+
import im.vector.app.core.platform.VectorViewModelAction
20+
21+
sealed class RoomAliasAction : VectorViewModelAction {
22+
// Canonical
23+
data class AddAlias(val alias: String) : RoomAliasAction()
24+
data class RemoveAlias(val alias: String) : RoomAliasAction()
25+
data class SetCanonicalAlias(val canonicalAlias: String) : RoomAliasAction()
26+
object UnSetCanonicalAlias : RoomAliasAction()
27+
28+
// Local
29+
data class AddLocalAlias(val aliasLocalPart: String) : RoomAliasAction()
30+
data class RemoveLocalAlias(val alias: String) : RoomAliasAction()
31+
}

0 commit comments

Comments
 (0)