diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt index 93a1b962ed..ed809cdb04 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt @@ -39,7 +39,11 @@ data class MatrixConfiguration( /** * True to advertise support for call transfers to other parties on Matrix calls. */ - val supportsCallTransfer: Boolean = false + val supportsCallTransfer: Boolean = false, + /** + * RoomDisplayNameFallbackProvider to provide default room display name. + */ + val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider ) { /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt new file mode 100644 index 0000000000..4ac14d5f63 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api + +interface RoomDisplayNameFallbackProvider { + fun getNameForRoomInvite(): String + fun getNameForEmptyRoom(): String + fun getNameFor2members(name1: String?, name2: String?): String + fun getNameFor3members(name1: String?, name2: String?, name3: String?): String + fun getNameFor4members(name1: String?, name2: String?, name3: String?, name4: String?): String + fun getNameFor4membersAndMore(name1: String?, name2: String?, name3: String?, remainingCount: Int): String +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt index 784b610af7..6948dd956a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt @@ -17,7 +17,7 @@ package org.matrix.android.sdk.internal.session.room.membership import io.realm.Realm -import org.matrix.android.sdk.R +import org.matrix.android.sdk.api.MatrixConfiguration import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.Membership @@ -32,17 +32,18 @@ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity import org.matrix.android.sdk.internal.database.query.getOrNull import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.UserId -import org.matrix.android.sdk.internal.util.StringProvider import javax.inject.Inject /** * This class computes room display name */ internal class RoomDisplayNameResolver @Inject constructor( - private val stringProvider: StringProvider, + matrixConfiguration: MatrixConfiguration, @UserId private val userId: String ) { + private val roomDisplayNameFallbackProvider= matrixConfiguration.roomDisplayNameFallbackProvider + /** * Compute the room display name * @@ -82,7 +83,7 @@ internal class RoomDisplayNameResolver @Inject constructor( .findFirst() ?.displayName } else { - stringProvider.getString(R.string.room_displayname_room_invite) + roomDisplayNameFallbackProvider.getNameForRoomInvite() } } else if (roomEntity?.membership == Membership.JOIN) { val roomSummary = RoomSummaryEntity.where(realm, roomId).findFirst() @@ -104,25 +105,25 @@ internal class RoomDisplayNameResolver @Inject constructor( val otherMembersCount = otherMembersSubset.count() name = when (otherMembersCount) { 0 -> { - stringProvider.getString(R.string.room_displayname_empty_room) + roomDisplayNameFallbackProvider.getNameForEmptyRoom() // TODO (was xx and yyy) ... } 1 -> resolveRoomMemberName(otherMembersSubset[0], roomMembers) 2 -> { - stringProvider.getString(R.string.room_displayname_two_members, + roomDisplayNameFallbackProvider.getNameFor2members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers) ) } 3 -> { - stringProvider.getString(R.string.room_displayname_3_members, + roomDisplayNameFallbackProvider.getNameFor3members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers) ) } 4 -> { - stringProvider.getString(R.string.room_displayname_4_members, + roomDisplayNameFallbackProvider.getNameFor4members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers), @@ -131,9 +132,7 @@ internal class RoomDisplayNameResolver @Inject constructor( } else -> { val remainingCount = invitedCount + joinedCount - otherMembersCount + 1 - stringProvider.getQuantityString( - R.plurals.room_displayname_four_and_more_members, - remainingCount, + roomDisplayNameFallbackProvider.getNameFor4membersAndMore( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers), diff --git a/vector/src/main/java/im/vector/app/VectorApplication.kt b/vector/src/main/java/im/vector/app/VectorApplication.kt index dd94be77ba..f3e2f8740e 100644 --- a/vector/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector/src/main/java/im/vector/app/VectorApplication.kt @@ -53,6 +53,7 @@ import im.vector.app.features.notifications.NotificationUtils import im.vector.app.features.pin.PinLocker import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.rageshake.VectorUncaughtExceptionHandler +import im.vector.app.features.room.VectorRoomDisplayNameFallbackProvider import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.themes.ThemeUtils @@ -205,7 +206,12 @@ class VectorApplication : } } - override fun providesMatrixConfiguration() = MatrixConfiguration(applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION) + override fun providesMatrixConfiguration(): MatrixConfiguration { + return MatrixConfiguration( + applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION, + roomDisplayNameFallbackProvider = VectorRoomDisplayNameFallbackProvider(this) + ) + } override fun getWorkManagerConfiguration(): WorkConfiguration { return WorkConfiguration.Builder() diff --git a/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt b/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt new file mode 100644 index 0000000000..ca18e1d4c8 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.room + +import android.content.Context +import org.matrix.android.sdk.R +import org.matrix.android.sdk.api.RoomDisplayNameFallbackProvider + +class VectorRoomDisplayNameFallbackProvider( + private val context: Context +) : RoomDisplayNameFallbackProvider { + + override fun getNameForRoomInvite(): String { + return context.getString(R.string.room_displayname_room_invite) + } + + override fun getNameForEmptyRoom(): String { + return context.getString(R.string.room_displayname_empty_room) + } + + override fun getNameFor2members(name1: String?, name2: String?): String { + return context.getString(R.string.room_displayname_two_members, name1, name2) + } + + override fun getNameFor3members(name1: String?, name2: String?, name3: String?): String { + return context.getString(R.string.room_displayname_3_members, name1, name2, name3) + } + + override fun getNameFor4members(name1: String?, name2: String?, name3: String?, name4: String?): String { + return context.getString(R.string.room_displayname_4_members, name1, name2, name3, name4) + } + + override fun getNameFor4membersAndMore(name1: String?, name2: String?, name3: String?, remainingCount: Int): String { + return context.resources.getQuantityString( + R.plurals.room_displayname_four_and_more_members, + remainingCount, + name1, + name2, + name3, + remainingCount + ) + } +}