From 1108ad5705b5dc8060c5a531e6f8d89fc1569f5c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 13 Dec 2019 16:42:48 +0100 Subject: [PATCH 01/11] Scroll breadcrumbs to top when opened --- CHANGES.md | 2 +- .../home/room/breadcrumbs/BreadcrumbsFragment.kt | 4 ++++ .../features/home/room/detail/RoomDetailActivity.kt | 10 ++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d2d1902205..ee7bc25530 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,7 +11,7 @@ Other changes: - Bugfix πŸ›: - - + - Scroll breadcrumbs to top when opened Translations πŸ—£: - diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsFragment.kt index b8e2cf7987..892b778ec4 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsFragment.kt @@ -65,4 +65,8 @@ class BreadcrumbsFragment @Inject constructor( override fun onBreadcrumbClicked(roomId: String) { sharedActionViewModel.post(RoomDetailSharedAction.SwitchToRoom(roomId)) } + + fun scrollToTop() { + breadcrumbsRecyclerView.scrollToPosition(0) + } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActivity.kt index 431c9e6395..14e9061c36 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailActivity.kt @@ -86,9 +86,19 @@ class RoomDetailActivity : VectorBaseActivity(), ToolbarConfigurable { private val drawerListener = object : DrawerLayout.SimpleDrawerListener() { override fun onDrawerStateChanged(newState: Int) { hideKeyboard() + + if (!drawerLayout.isDrawerOpen(GravityCompat.START) && newState == DrawerLayout.STATE_DRAGGING) { + // User is starting to open the drawer, scroll the list to op + scrollBreadcrumbsToTop() + } } } + private fun scrollBreadcrumbsToTop() { + supportFragmentManager.fragments.filterIsInstance() + .forEach { it.scrollToTop() } + } + override fun onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) From b435212c875d7957fdaf11bb0a0cc9ad454f1137 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 13 Dec 2019 20:50:18 +0100 Subject: [PATCH 02/11] Use same default room colors than Riot-Web And create MatrixItem --- CHANGES.md | 2 +- build.gradle | 2 +- .../api/session/room/send/UserMentionSpan.kt | 5 +- .../matrix/android/api/util/MatrixItem.kt | 75 +++++++++++++++++++ .../session/room/send/pills/TextPillsUtils.kt | 2 +- .../android/internal/util/StringUtils.kt | 1 + .../BottomSheetMessagePreviewItem.kt | 11 +-- .../bottomsheet/BottomSheetRoomPreviewItem.kt | 11 +-- .../core/preference/UserAvatarPreference.kt | 5 +- .../riotx/core/ui/views/ReadReceiptsView.kt | 6 +- .../user/AutocompleteUserController.kt | 7 +- .../autocomplete/user/AutocompleteUserItem.kt | 9 +-- .../SASVerificationIncomingFragment.kt | 5 +- .../riotx/features/home/AvatarRenderer.kt | 63 ++++------------ .../riotx/features/home/HomeDetailFragment.kt | 10 +-- .../riotx/features/home/HomeDrawerFragment.kt | 3 +- .../vector/riotx/features/home/RoomColor.kt | 29 +++++++ .../createdirect/CreateDirectRoomUserItem.kt | 15 ++-- .../createdirect/DirectoryUsersController.kt | 10 ++- .../home/createdirect/KnownUsersController.kt | 9 +-- .../home/group/GroupSummaryController.kt | 5 +- .../features/home/group/GroupSummaryItem.kt | 9 +-- .../room/breadcrumbs/BreadcrumbsController.kt | 5 +- .../home/room/breadcrumbs/BreadcrumbsItem.kt | 7 +- .../home/room/detail/RoomDetailFragment.kt | 23 +++--- .../readreceipts/DisplayReadReceiptItem.kt | 9 +-- .../DisplayReadReceiptsController.kt | 5 +- .../action/MessageActionsEpoxyController.kt | 4 +- .../detail/timeline/item/AbsMessageItem.kt | 7 +- .../detail/timeline/item/MergedHeaderItem.kt | 3 +- .../timeline/item/MessageInformationData.kt | 7 +- .../room/detail/timeline/item/NoticeItem.kt | 8 +- .../home/room/list/RoomInvitationItem.kt | 9 +-- .../home/room/list/RoomSummaryItem.kt | 9 +-- .../home/room/list/RoomSummaryItemFactory.kt | 9 +-- .../RoomListQuickActionsEpoxyController.kt | 5 +- .../riotx/features/html/MxLinkTagHandler.kt | 5 +- .../riotx/features/html/PillImageSpan.kt | 12 +-- .../riotx/features/invite/VectorInviteView.kt | 3 +- .../features/roomdirectory/PublicRoomItem.kt | 13 +--- .../roomdirectory/PublicRoomsController.kt | 5 +- .../RoomPreviewNoPreviewFragment.kt | 5 +- .../ignored/IgnoredUsersController.kt | 13 ++-- .../features/settings/ignored/UserItem.kt | 10 +-- 44 files changed, 258 insertions(+), 212 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt create mode 100644 vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt diff --git a/CHANGES.md b/CHANGES.md index ee7bc25530..6b02cc2102 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,7 +8,7 @@ Improvements πŸ™Œ: - Other changes: - - + - Use same default room colors than Riot-Web Bugfix πŸ›: - Scroll breadcrumbs to top when opened diff --git a/build.gradle b/build.gradle index 714152370e..6f0874dc81 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.5.3' classpath 'com.google.gms:google-services:4.3.2' classpath "com.airbnb.okreplay:gradle-plugin:1.5.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/UserMentionSpan.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/UserMentionSpan.kt index 4cd8080dc3..71a422bac8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/UserMentionSpan.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/send/UserMentionSpan.kt @@ -16,11 +16,12 @@ package im.vector.matrix.android.api.session.room.send +import im.vector.matrix.android.api.util.MatrixItem + /** * Tag class for spans that should mention a user. * These Spans will be transformed into pills when detected in message to send */ interface UserMentionSpan { - val displayName: String - val userId: String + val matrixItem: MatrixItem } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt new file mode 100644 index 0000000000..b94335e526 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2019 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.matrix.android.api.util + +import im.vector.matrix.android.api.session.group.model.GroupSummary +import im.vector.matrix.android.api.session.room.model.RoomSummary +import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom +import im.vector.matrix.android.api.session.user.model.User + +sealed class MatrixItem( + open val id: String, + open val displayName: String?, + open val avatarUrl: String? +) { + data class UserItem(override val id: String, + override val displayName: String? = null, + override val avatarUrl: String? = null + ) : MatrixItem(id, displayName, avatarUrl) + + data class EventItem(override val id: String, + override val displayName: String? = null, + override val avatarUrl: String? = null) + : MatrixItem(id, displayName, avatarUrl) + + data class RoomItem(override val id: String, + override val displayName: String? = null, + override val avatarUrl: String? = null) + : MatrixItem(id, displayName, avatarUrl) + + data class RoomAliasItem(override val id: String, + override val displayName: String? = null, + override val avatarUrl: String? = null) + : MatrixItem(id, displayName, avatarUrl) + + data class GroupItem(override val id: String, + override val displayName: String? = null, + override val avatarUrl: String? = null) + : MatrixItem(id, displayName, avatarUrl) + + fun getBestName(): String { + return displayName?.takeIf { it.isNotBlank() } ?: id + } + + /** + * Return the prefix as defined in the matrix spec (and not extracted from the id) + */ + fun getPrefix() = when (this) { + is UserItem -> '@' + is EventItem -> '$' + is RoomItem -> '!' + is RoomAliasItem -> '#' + is GroupItem -> '+' + } + + companion object { + fun from(user: User) = UserItem(user.userId, user.displayName, user.avatarUrl) + fun from(groupSummary: GroupSummary) = GroupItem(groupSummary.groupId, groupSummary.displayName, groupSummary.avatarUrl) + fun from(roomSummary: RoomSummary) = RoomItem(roomSummary.roomId, roomSummary.displayName, roomSummary.avatarUrl) + fun from(publicRoom: PublicRoom) = RoomItem(publicRoom.roomId, publicRoom.name, publicRoom.avatarUrl) + } +} diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/pills/TextPillsUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/pills/TextPillsUtils.kt index 580e49b2ce..c079e456c0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/pills/TextPillsUtils.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/pills/TextPillsUtils.kt @@ -65,7 +65,7 @@ internal class TextPillsUtils @Inject constructor( // append text before pill append(text, currIndex, start) // append the pill - append(String.format(template, urlSpan.userId, urlSpan.displayName)) + append(String.format(template, urlSpan.matrixItem.id, urlSpan.matrixItem.displayName)) currIndex = end } // append text after the last pill diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt index 31da372bbe..c27d66efed 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt @@ -52,6 +52,7 @@ fun convertFromUTF8(s: String): String { } } +// TODO Improve this fun String?.firstLetterOfDisplayName(): String { if (this.isNullOrEmpty()) return "" val isUserId = MatrixPatterns.isUserId(this) diff --git a/vector/src/main/java/im/vector/riotx/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt b/vector/src/main/java/im/vector/riotx/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt index 8105d7a7c0..7b79ce8549 100644 --- a/vector/src/main/java/im/vector/riotx/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt +++ b/vector/src/main/java/im/vector/riotx/core/epoxy/bottomsheet/BottomSheetMessagePreviewItem.kt @@ -21,6 +21,7 @@ import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -37,11 +38,7 @@ abstract class BottomSheetMessagePreviewItem : VectorEpoxyModel>() { +class AutocompleteUserController @Inject constructor() : TypedEpoxyController>() { var listener: AutocompleteClickListener? = null @@ -35,9 +36,7 @@ class AutocompleteUserController @Inject constructor(): TypedEpoxyController autocompleteUserItem { id(user.userId) - userId(user.userId) - name(user.displayName) - avatarUrl(user.avatarUrl) + matrixItem(MatrixItem.from(user)) avatarRenderer(avatarRenderer) clickListener { _ -> listener?.onItemClick(user) diff --git a/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserItem.kt b/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserItem.kt index b32562d8e6..8581ba8e2c 100644 --- a/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserItem.kt @@ -21,6 +21,7 @@ import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -30,15 +31,13 @@ import im.vector.riotx.features.home.AvatarRenderer abstract class AutocompleteUserItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute var name: String? = null - @EpoxyAttribute var userId: String = "" - @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var clickListener: View.OnClickListener? = null override fun bind(holder: Holder) { holder.view.setOnClickListener(clickListener) - holder.nameView.text = name - avatarRenderer.render(avatarUrl, userId, name, holder.avatarImageView) + holder.nameView.text = matrixItem.getBestName() + avatarRenderer.render(matrixItem, holder.avatarImageView) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt index 88df53d0f3..47d7e783b4 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt @@ -22,6 +22,7 @@ import androidx.lifecycle.Observer import butterknife.BindView import butterknife.OnClick import im.vector.matrix.android.api.session.crypto.sas.IncomingSasVerificationTransaction +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.home.AvatarRenderer @@ -57,10 +58,10 @@ class SASVerificationIncomingFragment @Inject constructor( otherDeviceTextView.text = viewModel.otherDeviceId viewModel.otherUser?.let { - avatarRenderer.render(it, avatarImageView) + avatarRenderer.render(MatrixItem.from(it), avatarImageView) } ?: run { // Fallback to what we know - avatarRenderer.render(null, viewModel.otherUserId ?: "", viewModel.otherUserId, avatarImageView) + avatarRenderer.render(MatrixItem.UserItem(viewModel.otherUserId ?: "", viewModel.otherUserId), avatarImageView) } viewModel.transactionState.observe(viewLifecycleOwner, Observer { diff --git a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt index 9975ee91cd..736cb6e4ff 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt @@ -27,10 +27,8 @@ import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.DrawableImageViewTarget import com.bumptech.glide.request.target.Target import im.vector.matrix.android.api.session.content.ContentUrlResolver -import im.vector.matrix.android.api.session.room.model.RoomSummary -import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.matrix.android.internal.util.firstLetterOfDisplayName -import im.vector.riotx.R import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.glide.GlideApp import im.vector.riotx.core.glide.GlideRequest @@ -45,54 +43,37 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active companion object { private const val THUMBNAIL_SIZE = 250 - - private val AVATAR_COLOR_LIST = listOf( - R.color.riotx_avatar_fill_1, - R.color.riotx_avatar_fill_2, - R.color.riotx_avatar_fill_3 - ) } @UiThread - fun render(roomSummary: RoomSummary, imageView: ImageView) { - render(roomSummary.avatarUrl, roomSummary.roomId, roomSummary.displayName, imageView) - } - - @UiThread - fun render(user: User, imageView: ImageView) { - render(imageView.context, GlideApp.with(imageView), user.avatarUrl, user.userId, user.displayName, DrawableImageViewTarget(imageView)) - } - - @UiThread - fun render(avatarUrl: String?, identifier: String, name: String?, imageView: ImageView) { - render(imageView.context, GlideApp.with(imageView), avatarUrl, identifier, name, DrawableImageViewTarget(imageView)) + fun render(matrixItem: MatrixItem, imageView: ImageView) { + render(imageView.context, + GlideApp.with(imageView), + matrixItem, + DrawableImageViewTarget(imageView)) } @UiThread fun render(context: Context, glideRequest: GlideRequests, - avatarUrl: String?, - identifier: String, - name: String?, + matrixItem: MatrixItem, target: Target) { - val displayName = if (name.isNullOrBlank()) { - identifier - } else { - name - } - val placeholder = getPlaceholderDrawable(context, identifier, displayName) - buildGlideRequest(glideRequest, avatarUrl) + val placeholder = getPlaceholderDrawable(context, matrixItem) + buildGlideRequest(glideRequest, matrixItem.avatarUrl) .placeholder(placeholder) .into(target) } @AnyThread - fun getPlaceholderDrawable(context: Context, identifier: String, text: String): Drawable { - val avatarColor = ContextCompat.getColor(context, getColorFromUserId(identifier)) - return if (text.isEmpty()) { + fun getPlaceholderDrawable(context: Context, matrixItem: MatrixItem): Drawable { + val avatarColor = when (matrixItem) { + is MatrixItem.UserItem -> ContextCompat.getColor(context, getColorFromUserId(matrixItem.id)) + else -> ContextCompat.getColor(context, getColorFromRoomId(matrixItem.id)) + } + return if (matrixItem.displayName.isNullOrBlank()) { TextDrawable.builder().buildRound("", avatarColor) } else { - val firstLetter = text.firstLetterOfDisplayName() + val firstLetter = matrixItem.displayName.firstLetterOfDisplayName() TextDrawable.builder() .beginConfig() .bold() @@ -103,18 +84,6 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active // PRIVATE API ********************************************************************************* -// private fun getAvatarColor(text: String? = null): Int { -// var colorIndex: Long = 0 -// if (!text.isNullOrEmpty()) { -// var sum: Long = 0 -// for (i in 0 until text.length) { -// sum += text[i].toLong() -// } -// colorIndex = sum % AVATAR_COLOR_LIST.size -// } -// return AVATAR_COLOR_LIST[colorIndex.toInt()] -// } - private fun buildGlideRequest(glideRequest: GlideRequests, avatarUrl: String?): GlideRequest { val resolvedUrl = activeSessionHolder.getActiveSession().contentUrlResolver() .resolveThumbnail(avatarUrl, THUMBNAIL_SIZE, THUMBNAIL_SIZE, ContentUrlResolver.ThumbnailMethod.SCALE) diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt index ac8d429cb1..d844d0a2f0 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt @@ -27,6 +27,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationItemView import com.google.android.material.bottomnavigation.BottomNavigationMenuView import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState import im.vector.matrix.android.api.session.group.model.GroupSummary +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.commitTransactionNow import im.vector.riotx.core.platform.ToolbarConfigurable @@ -74,12 +75,7 @@ class HomeDetailFragment @Inject constructor( private fun onGroupChange(groupSummary: GroupSummary?) { groupSummary?.let { - avatarRenderer.render( - it.avatarUrl, - it.groupId, - it.displayName, - groupToolbarAvatarImageView - ) + avatarRenderer.render(MatrixItem.from(it), groupToolbarAvatarImageView) } } @@ -155,7 +151,7 @@ class HomeDetailFragment @Inject constructor( bottomNavigationView.selectedItemId = when (displayMode) { RoomListDisplayMode.PEOPLE -> R.id.bottom_action_people RoomListDisplayMode.ROOMS -> R.id.bottom_action_rooms - else -> R.id.bottom_action_home + else -> R.id.bottom_action_home } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt index 422b59671e..32344db2df 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt @@ -19,6 +19,7 @@ package im.vector.riotx.features.home import android.os.Bundle import android.view.View import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.observeK import im.vector.riotx.core.extensions.replaceChildFragment @@ -42,7 +43,7 @@ class HomeDrawerFragment @Inject constructor( session.liveUser(session.myUserId).observeK(this) { optionalUser -> val user = optionalUser?.getOrNull() if (user != null) { - avatarRenderer.render(user.avatarUrl, user.userId, user.displayName, homeDrawerHeaderAvatarView) + avatarRenderer.render(MatrixItem.from(user), homeDrawerHeaderAvatarView) homeDrawerUsernameView.text = user.displayName homeDrawerUserIdView.text = user.userId } diff --git a/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt b/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt new file mode 100644 index 0000000000..48f2e22b6d --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2019 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.riotx.features.home + +import androidx.annotation.ColorRes +import im.vector.riotx.R + +@ColorRes +fun getColorFromRoomId(roomId: String? = null): Int { + return when ((roomId?.toList()?.sumBy { it.toInt() } ?: 0) % 3) { + 1 -> R.color.riotx_avatar_fill_2 + 2 -> R.color.riotx_avatar_fill_3 + else -> R.color.riotx_avatar_fill_1 + } +} diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomUserItem.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomUserItem.kt index 0ff4c5baf8..401d4445fe 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomUserItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomUserItem.kt @@ -25,6 +25,7 @@ import androidx.core.content.ContextCompat import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.amulyakhare.textdrawable.TextDrawable +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -34,22 +35,20 @@ import im.vector.riotx.features.home.AvatarRenderer abstract class CreateDirectRoomUserItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute var name: String? = null - @EpoxyAttribute var userId: String = "" - @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var clickListener: View.OnClickListener? = null @EpoxyAttribute var selected: Boolean = false override fun bind(holder: Holder) { holder.view.setOnClickListener(clickListener) // If name is empty, use userId as name and force it being centered - if (name.isNullOrEmpty()) { + if (matrixItem.displayName.isNullOrEmpty()) { holder.userIdView.visibility = View.GONE - holder.nameView.text = userId + holder.nameView.text = matrixItem.id } else { holder.userIdView.visibility = View.VISIBLE - holder.nameView.text = name - holder.userIdView.text = userId + holder.nameView.text = matrixItem.displayName + holder.userIdView.text = matrixItem.id } renderSelection(holder, selected) } @@ -62,7 +61,7 @@ abstract class CreateDirectRoomUserItem : VectorEpoxyModel callback?.onItemClick(user) diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt index 3d1ee84254..6a4fdd553b 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt @@ -23,6 +23,7 @@ import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.matrix.android.internal.util.firstLetterOfDisplayName import im.vector.riotx.R import im.vector.riotx.core.epoxy.EmptyItem_ @@ -68,9 +69,7 @@ class KnownUsersController @Inject constructor(private val session: Session, CreateDirectRoomUserItem_() .id(item.userId) .selected(isSelected) - .userId(item.userId) - .name(item.displayName) - .avatarUrl(item.avatarUrl) + .matrixItem(MatrixItem.from(item)) .avatarRenderer(avatarRenderer) .clickListener { _ -> callback?.onItemClick(item) @@ -87,8 +86,8 @@ class KnownUsersController @Inject constructor(private val session: Session, var lastFirstLetter: String? = null for (model in models) { if (model is CreateDirectRoomUserItem) { - if (model.userId == session.myUserId) continue - val currentFirstLetter = model.name.firstLetterOfDisplayName() + if (model.matrixItem.id == session.myUserId) continue + val currentFirstLetter = model.matrixItem.displayName.firstLetterOfDisplayName() val showLetter = !isFiltering && currentFirstLetter.isNotEmpty() && lastFirstLetter != currentFirstLetter lastFirstLetter = currentFirstLetter diff --git a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt index 7c3cfd2a94..4e98ddb412 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.group import com.airbnb.epoxy.EpoxyController import im.vector.matrix.android.api.session.group.model.GroupSummary +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.features.home.AvatarRenderer import javax.inject.Inject @@ -49,10 +50,8 @@ class GroupSummaryController @Inject constructor(private val avatarRenderer: Ava groupSummaryItem { avatarRenderer(avatarRenderer) id(groupSummary.groupId) - groupId(groupSummary.groupId) - groupName(groupSummary.displayName) + matrixItem(MatrixItem.from(groupSummary)) selected(isSelected) - avatarUrl(groupSummary.avatarUrl) listener { callback?.onGroupSelected(groupSummary) } } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryItem.kt b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryItem.kt index 30c1852f1d..61c589cc00 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryItem.kt @@ -20,6 +20,7 @@ import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -30,18 +31,16 @@ import im.vector.riotx.features.home.AvatarRenderer abstract class GroupSummaryItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute lateinit var groupName: CharSequence - @EpoxyAttribute lateinit var groupId: String - @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var selected: Boolean = false @EpoxyAttribute var listener: (() -> Unit)? = null override fun bind(holder: Holder) { super.bind(holder) holder.rootView.setOnClickListener { listener?.invoke() } - holder.groupNameView.text = groupName + holder.groupNameView.text = matrixItem.displayName holder.rootView.isChecked = selected - avatarRenderer.render(avatarUrl, groupId, groupName.toString(), holder.avatarImageView) + avatarRenderer.render(matrixItem, holder.avatarImageView) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt index 3e400b37ea..a3e46d3197 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.breadcrumbs import android.view.View import com.airbnb.epoxy.EpoxyController +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.features.home.AvatarRenderer import javax.inject.Inject @@ -52,9 +53,7 @@ class BreadcrumbsController @Inject constructor( breadcrumbsItem { id(it.roomId) avatarRenderer(avatarRenderer) - roomId(it.roomId) - roomName(it.displayName) - avatarUrl(it.avatarUrl) + matrixItem(MatrixItem.from(it)) unreadNotificationCount(it.notificationCount) showHighlighted(it.highlightCount > 0) hasUnreadMessage(it.hasUnreadMessages) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsItem.kt index 074c35af00..6d18a85b75 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsItem.kt @@ -22,6 +22,7 @@ import android.widget.ImageView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -32,9 +33,7 @@ import im.vector.riotx.features.home.room.list.UnreadCounterBadgeView abstract class BreadcrumbsItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute lateinit var roomId: String - @EpoxyAttribute lateinit var roomName: CharSequence - @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var unreadNotificationCount: Int = 0 @EpoxyAttribute var showHighlighted: Boolean = false @EpoxyAttribute var hasUnreadMessage: Boolean = false @@ -45,7 +44,7 @@ abstract class BreadcrumbsItem : VectorEpoxyModel() { super.bind(holder) holder.rootView.setOnClickListener(itemClickListener) holder.unreadIndentIndicator.isVisible = hasUnreadMessage - avatarRenderer.render(avatarUrl, roomId, roomName.toString(), holder.avatarImageView) + avatarRenderer.render(matrixItem, holder.avatarImageView) holder.unreadCounterBadgeView.render(UnreadCounterBadgeView.State(unreadNotificationCount, showHighlighted)) holder.draftIndentIndicator.isVisible = hasDraft } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index 80f54a9c1f..fd72e85199 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -66,6 +66,7 @@ import im.vector.matrix.android.api.session.room.timeline.Timeline import im.vector.matrix.android.api.session.room.timeline.TimelineEvent import im.vector.matrix.android.api.session.room.timeline.getLastMessageContent import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.dialogs.withColoredButton import im.vector.riotx.core.epoxy.LayoutManagerStateRestorer @@ -410,9 +411,7 @@ class RoomDetailFragment @Inject constructor( composerLayout.sendButton.setContentDescription(getString(descriptionRes)) avatarRenderer.render( - event.senderAvatar, - event.root.senderId ?: "", - event.getDisambiguatedDisplayName(), + MatrixItem.UserItem(event.root.senderId ?: "", event.getDisambiguatedDisplayName(), event.senderAvatar), composerLayout.composerRelatedMessageAvatar ) composerLayout.expand { @@ -601,20 +600,19 @@ class RoomDetailFragment @Inject constructor( } // Replace the word by its completion - val displayName = item.displayName ?: item.userId + val matrixItem = MatrixItem.from(item) + val displayName = matrixItem.getBestName() // with a trailing space editable.replace(startIndex, endIndex, "$displayName ") // Add the span - val user = session.getUser(item.userId) val span = PillImageSpan( glideRequests, avatarRenderer, requireContext(), - item.userId, - user?.displayName ?: item.userId, - user?.avatarUrl) + matrixItem + ) span.bind(composerLayout.composerEditText) editable.setSpan(span, startIndex, startIndex + displayName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) @@ -686,7 +684,7 @@ class RoomDetailFragment @Inject constructor( inviteView.visibility = View.GONE val uid = session.myUserId val meMember = session.getRoom(state.roomId)?.getRoomMember(uid) - avatarRenderer.render(meMember?.avatarUrl, uid, meMember?.displayName, composerLayout.composerAvatarImageView) + avatarRenderer.render(MatrixItem.UserItem(uid, meMember?.displayName, meMember?.avatarUrl), composerLayout.composerAvatarImageView) } else if (summary?.membership == Membership.INVITE && inviter != null) { inviteView.visibility = View.VISIBLE inviteView.render(inviter, VectorInviteView.Mode.LARGE) @@ -713,7 +711,7 @@ class RoomDetailFragment @Inject constructor( activity?.finish() } else { roomToolbarTitleView.text = it.displayName - avatarRenderer.render(it, roomToolbarAvatarImageView) + avatarRenderer.render(MatrixItem.from(it), roomToolbarAvatarImageView) roomToolbarSubtitleView.setTextOrHide(it.topic) } jumpToBottomView.count = it.notificationCount @@ -1197,9 +1195,8 @@ class RoomDetailFragment @Inject constructor( glideRequests, avatarRenderer, requireContext(), - userId, - displayName, - roomMember?.avatarUrl) + MatrixItem.UserItem(userId, displayName, roomMember?.avatarUrl) + ) .also { it.bind(composerLayout.composerEditText) }, 0, displayName.length, diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt index 2b7d64a80e..6bc93f28dc 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptItem.kt @@ -22,6 +22,7 @@ import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelWithHolder +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.features.home.AvatarRenderer @@ -29,15 +30,13 @@ import im.vector.riotx.features.home.AvatarRenderer @EpoxyModelClass(layout = R.layout.item_display_read_receipt) abstract class DisplayReadReceiptItem : EpoxyModelWithHolder() { - @EpoxyAttribute var name: String? = null - @EpoxyAttribute var userId: String = "" - @EpoxyAttribute var avatarUrl: String? = null + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var timestamp: CharSequence? = null @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer override fun bind(holder: Holder) { - avatarRenderer.render(avatarUrl, userId, name, holder.avatarView) - holder.displayNameView.text = name ?: userId + avatarRenderer.render(matrixItem, holder.avatarView) + holder.displayNameView.text = matrixItem.getBestName() timestamp?.let { holder.timestampView.text = it holder.timestampView.isVisible = true diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt index 6affa582bc..ef7dba5caf 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.detail.readreceipts import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.core.date.VectorDateFormatter import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData @@ -36,9 +37,7 @@ class DisplayReadReceiptsController @Inject constructor(private val dateFormatte val timestamp = dateFormatter.formatRelativeDateTime(it.timestamp) DisplayReadReceiptItem_() .id(it.userId) - .userId(it.userId) - .avatarUrl(it.avatarUrl) - .name(it.displayName) + .matrixItem(MatrixItem.UserItem(it.userId, it.displayName, it.avatarUrl)) .avatarRenderer(avatarRender) .timestamp(timestamp) .addIf(session.myUserId != it.userId, this) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt index efbfd3434c..939564e780 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt @@ -44,9 +44,7 @@ class MessageActionsEpoxyController @Inject constructor(private val stringProvid bottomSheetMessagePreviewItem { id("preview") avatarRenderer(avatarRenderer) - avatarUrl(state.informationData.avatarUrl ?: "") - senderId(state.informationData.senderId) - senderName(state.senderName()) + matrixItem(state.informationData.matrixItem) movementMethod(createLinkMovementMethod(listener)) body(body.linkify(listener)) time(state.time()) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt index 713b60d4d8..af4c55e742 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -77,12 +77,7 @@ abstract class AbsMessageItem : BaseEventItem() { holder.timeView.visibility = View.VISIBLE holder.timeView.text = attributes.informationData.time holder.memberNameView.text = attributes.informationData.memberName - attributes.avatarRenderer.render( - attributes.informationData.avatarUrl, - attributes.informationData.senderId, - attributes.informationData.memberName?.toString(), - holder.avatarImageView - ) + attributes.avatarRenderer.render(attributes.informationData.matrixItem, holder.avatarImageView) holder.avatarImageView.setOnLongClickListener(attributes.itemLongClickListener) holder.memberNameView.setOnLongClickListener(attributes.itemLongClickListener) } else { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt index a2a3c9ad3b..728c8cd740 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt @@ -24,6 +24,7 @@ import androidx.core.view.children import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController @@ -54,7 +55,7 @@ abstract class MergedHeaderItem : BaseEventItem() { val data = distinctMergeData.getOrNull(index) if (data != null && view is ImageView) { view.visibility = View.VISIBLE - attributes.avatarRenderer.render(data.avatarUrl, data.userId, data.memberName, view) + attributes.avatarRenderer.render(MatrixItem.UserItem(data.userId, data.memberName, data.avatarUrl), view) } else { view.visibility = View.GONE } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt index 2dd581ce6f..ffaec7dd48 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.detail.timeline.item import android.os.Parcelable import im.vector.matrix.android.api.session.room.send.SendState +import im.vector.matrix.android.api.util.MatrixItem import kotlinx.android.parcel.Parcelize @Parcelize @@ -34,7 +35,11 @@ data class MessageInformationData( val hasBeenEdited: Boolean = false, val hasPendingEdits: Boolean = false, val readReceipts: List = emptyList() -) : Parcelable +) : Parcelable { + + val matrixItem: MatrixItem + get() = MatrixItem.UserItem(senderId, memberName?.toString(), avatarUrl) +} @Parcelize data class ReactionInfoData( diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/NoticeItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/NoticeItem.kt index 05dedcfa22..189c358b48 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/NoticeItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/NoticeItem.kt @@ -39,13 +39,7 @@ abstract class NoticeItem : BaseEventItem() { override fun bind(holder: Holder) { super.bind(holder) holder.noticeTextView.text = attributes.noticeText - attributes.avatarRenderer.render( - attributes.informationData.avatarUrl, - attributes.informationData.senderId, - attributes.informationData.memberName?.toString() - ?: attributes.informationData.senderId, - holder.avatarImageView - ) + attributes.avatarRenderer.render(attributes.informationData.matrixItem, holder.avatarImageView) holder.view.setOnLongClickListener(attributes.itemLongClickListener) holder.readReceiptsView.render(attributes.informationData.readReceipts, attributes.avatarRenderer, _readReceiptsClickListener) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomInvitationItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomInvitationItem.kt index 3bd097d67b..4e4e758aa2 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomInvitationItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomInvitationItem.kt @@ -22,6 +22,7 @@ import android.widget.TextView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -33,10 +34,8 @@ import im.vector.riotx.features.home.AvatarRenderer abstract class RoomInvitationItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute lateinit var roomName: CharSequence - @EpoxyAttribute lateinit var roomId: String + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute var secondLine: CharSequence? = null - @EpoxyAttribute var avatarUrl: String? = null @EpoxyAttribute var listener: (() -> Unit)? = null @EpoxyAttribute var invitationAcceptInProgress: Boolean = false @EpoxyAttribute var invitationAcceptInError: Boolean = false @@ -85,9 +84,9 @@ abstract class RoomInvitationItem : VectorEpoxyModel( rejectListener?.invoke() } } - holder.titleView.text = roomName + holder.titleView.text = matrixItem.getBestName() holder.subtitleView.setTextOrHide(secondLine) - avatarRenderer.render(avatarUrl, roomId, roomName.toString(), holder.avatarImageView) + avatarRenderer.render(matrixItem, holder.avatarImageView) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItem.kt index fe208a3085..23a0fd60a2 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItem.kt @@ -23,6 +23,7 @@ import android.widget.TextView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -32,11 +33,9 @@ import im.vector.riotx.features.home.AvatarRenderer abstract class RoomSummaryItem : VectorEpoxyModel() { @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer - @EpoxyAttribute lateinit var roomName: CharSequence - @EpoxyAttribute lateinit var roomId: String + @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute lateinit var lastFormattedEvent: CharSequence @EpoxyAttribute lateinit var lastEventTime: CharSequence - @EpoxyAttribute var avatarUrl: String? = null @EpoxyAttribute var unreadNotificationCount: Int = 0 @EpoxyAttribute var hasUnreadMessage: Boolean = false @EpoxyAttribute var hasDraft: Boolean = false @@ -48,13 +47,13 @@ abstract class RoomSummaryItem : VectorEpoxyModel() { super.bind(holder) holder.rootView.setOnClickListener(itemClickListener) holder.rootView.setOnLongClickListener(itemLongClickListener) - holder.titleView.text = roomName + holder.titleView.text = matrixItem.getBestName() holder.lastEventTimeView.text = lastEventTime holder.lastEventView.text = lastFormattedEvent holder.unreadCounterBadgeView.render(UnreadCounterBadgeView.State(unreadNotificationCount, showHighlighted)) holder.unreadIndentIndicator.isVisible = hasUnreadMessage holder.draftView.isVisible = hasDraft - avatarRenderer.render(avatarUrl, roomId, roomName.toString(), holder.avatarImageView) + avatarRenderer.render(matrixItem, holder.avatarImageView) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt index 85652c4139..96c8673ca7 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt @@ -21,6 +21,7 @@ import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.timeline.getLastMessageContent +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.date.VectorDateFormatter import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -69,7 +70,7 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte return RoomInvitationItem_() .id(roomSummary.roomId) .avatarRenderer(avatarRenderer) - .roomId(roomSummary.roomId) + .matrixItem(MatrixItem.from(roomSummary)) .secondLine(secondLine) .invitationAcceptInProgress(joiningRoomsIds.contains(roomSummary.roomId)) .invitationAcceptInError(joiningErrorRoomsIds.contains(roomSummary.roomId)) @@ -77,8 +78,6 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte .invitationRejectInError(rejectingErrorRoomsIds.contains(roomSummary.roomId)) .acceptListener { listener?.onAcceptRoomInvitation(roomSummary) } .rejectListener { listener?.onRejectRoomInvitation(roomSummary) } - .roomName(roomSummary.displayName) - .avatarUrl(roomSummary.avatarUrl) .listener { listener?.onRoomClicked(roomSummary) } } @@ -125,11 +124,9 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte return RoomSummaryItem_() .id(roomSummary.roomId) .avatarRenderer(avatarRenderer) - .roomId(roomSummary.roomId) + .matrixItem(MatrixItem.from(roomSummary)) .lastEventTime(latestEventTime) .lastFormattedEvent(latestFormattedEvent) - .roomName(roomSummary.displayName) - .avatarUrl(roomSummary.avatarUrl) .showHighlighted(showHighlighted) .unreadNotificationCount(unreadCount) .hasUnreadMessage(roomSummary.hasUnreadMessages) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt index 84fd5bc6f2..559dfd7301 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.list.actions import android.view.View import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.room.notification.RoomNotificationState +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetActionItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetRoomPreviewItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetSeparatorItem @@ -39,9 +40,7 @@ class RoomListQuickActionsEpoxyController @Inject constructor(private val avatar bottomSheetRoomPreviewItem { id("preview") avatarRenderer(avatarRenderer) - roomName(roomSummary.displayName) - avatarUrl(roomSummary.avatarUrl) - roomId(roomSummary.roomId) + matrixItem(MatrixItem.from(roomSummary)) settingsClickListener(View.OnClickListener { listener?.didSelectMenuAction(RoomListQuickActionsSharedAction.Settings(roomSummary.roomId)) }) } diff --git a/vector/src/main/java/im/vector/riotx/features/html/MxLinkTagHandler.kt b/vector/src/main/java/im/vector/riotx/features/html/MxLinkTagHandler.kt index ecbf0da415..3f16666221 100644 --- a/vector/src/main/java/im/vector/riotx/features/html/MxLinkTagHandler.kt +++ b/vector/src/main/java/im/vector/riotx/features/html/MxLinkTagHandler.kt @@ -20,6 +20,7 @@ import android.content.Context import android.text.style.URLSpan import im.vector.matrix.android.api.permalinks.PermalinkData import im.vector.matrix.android.api.permalinks.PermalinkParser +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.glide.GlideRequests import im.vector.riotx.features.home.AvatarRenderer @@ -41,8 +42,8 @@ class MxLinkTagHandler(private val glideRequests: GlideRequests, when (permalinkData) { is PermalinkData.UserLink -> { val user = sessionHolder.getSafeActiveSession()?.getUser(permalinkData.userId) - val span = PillImageSpan(glideRequests, avatarRenderer, context, permalinkData.userId, user?.displayName - ?: permalinkData.userId, user?.avatarUrl) + val span = PillImageSpan(glideRequests, avatarRenderer, context, MatrixItem.UserItem(permalinkData.userId, user?.displayName + ?: permalinkData.userId, user?.avatarUrl)) SpannableBuilder.setSpans( visitor.builder(), span, diff --git a/vector/src/main/java/im/vector/riotx/features/html/PillImageSpan.kt b/vector/src/main/java/im/vector/riotx/features/html/PillImageSpan.kt index a192c71961..8b57006439 100644 --- a/vector/src/main/java/im/vector/riotx/features/html/PillImageSpan.kt +++ b/vector/src/main/java/im/vector/riotx/features/html/PillImageSpan.kt @@ -29,6 +29,7 @@ import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition import com.google.android.material.chip.ChipDrawable import im.vector.matrix.android.api.session.room.send.UserMentionSpan +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.glide.GlideRequests import im.vector.riotx.features.home.AvatarRenderer @@ -42,9 +43,8 @@ import java.lang.ref.WeakReference class PillImageSpan(private val glideRequests: GlideRequests, private val avatarRenderer: AvatarRenderer, private val context: Context, - override val userId: String, - override val displayName: String, - private val avatarUrl: String?) : ReplacementSpan(), UserMentionSpan { + override val matrixItem: MatrixItem +) : ReplacementSpan(), UserMentionSpan { private val pillDrawable = createChipDrawable() private val target = PillImageSpanTarget(this) @@ -53,7 +53,7 @@ class PillImageSpan(private val glideRequests: GlideRequests, @UiThread fun bind(textView: TextView) { tv = WeakReference(textView) - avatarRenderer.render(context, glideRequests, avatarUrl, userId, displayName, target) + avatarRenderer.render(context, glideRequests, matrixItem, target) } // ReplacementSpan ***************************************************************************** @@ -101,12 +101,12 @@ class PillImageSpan(private val glideRequests: GlideRequests, private fun createChipDrawable(): ChipDrawable { val textPadding = context.resources.getDimension(R.dimen.pill_text_padding) return ChipDrawable.createFromResource(context, R.xml.pill_view).apply { - text = displayName + text = matrixItem.getBestName() textEndPadding = textPadding textStartPadding = textPadding setChipMinHeightResource(R.dimen.pill_min_height) setChipIconSizeResource(R.dimen.pill_avatar_size) - chipIcon = avatarRenderer.getPlaceholderDrawable(context, userId, displayName) + chipIcon = avatarRenderer.getPlaceholderDrawable(context, matrixItem) setBounds(0, 0, intrinsicWidth, intrinsicHeight) } } diff --git a/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt b/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt index 71420448f4..56217d9980 100644 --- a/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt +++ b/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt @@ -22,6 +22,7 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.updateLayoutParams import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.di.HasScreenInjector import im.vector.riotx.features.home.AvatarRenderer @@ -56,7 +57,7 @@ class VectorInviteView @JvmOverloads constructor(context: Context, attrs: Attrib fun render(sender: User, mode: Mode = Mode.LARGE) { if (mode == Mode.LARGE) { updateLayoutParams { height = LayoutParams.MATCH_CONSTRAINT } - avatarRenderer.render(sender.avatarUrl, sender.userId, sender.displayName, inviteAvatarView) + avatarRenderer.render(MatrixItem.from(sender), inviteAvatarView) inviteIdentifierView.text = sender.userId inviteNameView.text = sender.displayName inviteLabelView.text = context.getString(R.string.send_you_invite) diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomItem.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomItem.kt index 5e5c4fc5f1..108627e3f8 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomItem.kt @@ -21,6 +21,7 @@ import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -35,13 +36,7 @@ abstract class PublicRoomItem : VectorEpoxyModel() { lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute - var avatarUrl: String? = null - - @EpoxyAttribute - var roomId: String? = null - - @EpoxyAttribute - var roomName: String? = null + lateinit var matrixItem: MatrixItem @EpoxyAttribute var roomAlias: String? = null @@ -64,8 +59,8 @@ abstract class PublicRoomItem : VectorEpoxyModel() { override fun bind(holder: Holder) { holder.rootView.setOnClickListener { globalListener?.invoke() } - avatarRenderer.render(avatarUrl, roomId!!, roomName, holder.avatarView) - holder.nameView.text = roomName + avatarRenderer.render(matrixItem, holder.avatarView) + holder.nameView.text = matrixItem.displayName holder.aliasView.setTextOrHide(roomAlias) holder.topicView.setTextOrHide(roomTopic) // TODO Use formatter for big numbers? diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt index 183256a53e..97952059ce 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt @@ -22,6 +22,7 @@ import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Success import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.errorWithRetryItem import im.vector.riotx.core.epoxy.loadingItem @@ -83,9 +84,7 @@ class PublicRoomsController @Inject constructor(private val stringProvider: Stri publicRoomItem { avatarRenderer(avatarRenderer) id(publicRoom.roomId) - roomId(publicRoom.roomId) - avatarUrl(publicRoom.avatarUrl) - roomName(publicRoom.name) + matrixItem(MatrixItem.from(publicRoom)) roomAlias(publicRoom.canonicalAlias) roomTopic(publicRoom.topic) nbOfMembers(publicRoom.numJoinedMembers) diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt index 9003421dc7..e3a1830965 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt @@ -23,6 +23,7 @@ import androidx.transition.TransitionManager import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.core.extensions.setTextOrHide @@ -51,11 +52,11 @@ class RoomPreviewNoPreviewFragment @Inject constructor( super.onViewCreated(view, savedInstanceState) setupToolbar(roomPreviewNoPreviewToolbar) // Toolbar - avatarRenderer.render(roomPreviewData.avatarUrl, roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewNoPreviewToolbarAvatar) + avatarRenderer.render(MatrixItem.RoomItem(roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewData.avatarUrl), roomPreviewNoPreviewToolbarAvatar) roomPreviewNoPreviewToolbarTitle.text = roomPreviewData.roomName // Screen - avatarRenderer.render(roomPreviewData.avatarUrl, roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewNoPreviewAvatar) + avatarRenderer.render(MatrixItem.RoomItem(roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewData.avatarUrl), roomPreviewNoPreviewAvatar) roomPreviewNoPreviewName.text = roomPreviewData.roomName roomPreviewNoPreviewTopic.setTextOrHide(roomPreviewData.topic) diff --git a/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt b/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt index 120781874d..18f256a207 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.settings.ignored import com.airbnb.epoxy.EpoxyController import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.noResultItem import im.vector.riotx.core.resources.StringProvider @@ -44,19 +45,19 @@ class IgnoredUsersController @Inject constructor(private val stringProvider: Str buildIgnoredUserModels(nonNullViewState.ignoredUsers) } - private fun buildIgnoredUserModels(userIds: List) { - if (userIds.isEmpty()) { + private fun buildIgnoredUserModels(users: List) { + if (users.isEmpty()) { noResultItem { id("empty") text(stringProvider.getString(R.string.no_ignored_users)) } } else { - userIds.forEach { userId -> + users.forEach { user -> userItem { - id(userId.userId) + id(user.userId) avatarRenderer(avatarRenderer) - user(userId) - itemClickAction { callback?.onUserIdClicked(userId.userId) } + matrixItem(MatrixItem.from(user)) + itemClickAction { callback?.onUserIdClicked(user.userId) } } } } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/ignored/UserItem.kt b/vector/src/main/java/im/vector/riotx/features/settings/ignored/UserItem.kt index a9c1b98915..23fb03d59a 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/ignored/UserItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/ignored/UserItem.kt @@ -20,7 +20,7 @@ import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass -import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -37,7 +37,7 @@ abstract class UserItem : VectorEpoxyModel() { lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute - lateinit var user: User + lateinit var matrixItem: MatrixItem @EpoxyAttribute var itemClickAction: (() -> Unit)? = null @@ -45,9 +45,9 @@ abstract class UserItem : VectorEpoxyModel() { override fun bind(holder: Holder) { holder.root.setOnClickListener { itemClickAction?.invoke() } - avatarRenderer.render(user, holder.avatarImage) - holder.userIdText.setTextOrHide(user.userId) - holder.displayNameText.setTextOrHide(user.displayName) + avatarRenderer.render(matrixItem, holder.avatarImage) + holder.userIdText.setTextOrHide(matrixItem.id) + holder.displayNameText.setTextOrHide(matrixItem.displayName) } class Holder : VectorEpoxyHolder() { From fbb1846694292ab2749345a8e90f358cfddbadb0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 13 Dec 2019 21:17:52 +0100 Subject: [PATCH 03/11] Render default room name when it starts with an emoji (#477) --- CHANGES.md | 1 + .../matrix/android/api/util/MatrixItem.kt | 36 +++++++++++++++++++ .../android/internal/util/StringUtils.kt | 10 ------ .../riotx/features/home/AvatarRenderer.kt | 3 +- .../createdirect/CreateDirectRoomViewModel.kt | 4 +-- .../home/createdirect/KnownUsersController.kt | 3 +- 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6b02cc2102..a5953dcb14 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ Other changes: Bugfix πŸ›: - Scroll breadcrumbs to top when opened + - Render default room name when it starts with an emoji (#477) Translations πŸ—£: - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt index b94335e526..c6d5665d0d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -20,6 +20,7 @@ import im.vector.matrix.android.api.session.group.model.GroupSummary import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom import im.vector.matrix.android.api.session.user.model.User +import java.util.* sealed class MatrixItem( open val id: String, @@ -66,6 +67,41 @@ sealed class MatrixItem( is GroupItem -> '+' } + fun firstLetterOfDisplayName(): String { + return displayName + ?.takeIf { it.isNotBlank() } + ?.let { dn -> + var startIndex = 0 + val initial = dn[startIndex] + + if (initial in listOf('@', '#', '+') && dn.length > 1) { + startIndex++ + } + + var length = 1 + var first = dn[startIndex] + + // LEFT-TO-RIGHT MARK + if (dn.length >= 2 && 0x200e == first.toInt()) { + startIndex++ + first = dn[startIndex] + } + + // check if it’s the start of a surrogate pair + if (first.toInt() in 0xD800..0xDBFF && dn.length > startIndex + 1) { + val second = dn[startIndex + 1] + if (second.toInt() in 0xDC00..0xDFFF) { + length++ + } + } + + dn.substring(startIndex, startIndex + length) + } + ?.toUpperCase(Locale.ROOT) + ?: " " + } + + companion object { fun from(user: User) = UserItem(user.userId, user.displayName, user.avatarUrl) fun from(groupSummary: GroupSummary) = GroupItem(groupSummary.groupId, groupSummary.displayName, groupSummary.avatarUrl) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt index c27d66efed..f19bebe482 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/StringUtils.kt @@ -16,9 +16,7 @@ package im.vector.matrix.android.internal.util -import im.vector.matrix.android.api.MatrixPatterns import timber.log.Timber -import java.util.Locale /** * Convert a string to an UTF8 String @@ -51,11 +49,3 @@ fun convertFromUTF8(s: String): String { s } } - -// TODO Improve this -fun String?.firstLetterOfDisplayName(): String { - if (this.isNullOrEmpty()) return "" - val isUserId = MatrixPatterns.isUserId(this) - val firstLetterIndex = if (isUserId) 1 else 0 - return this[firstLetterIndex].toString().toUpperCase(Locale.ROOT) -} diff --git a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt index 736cb6e4ff..ae02ce6519 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt @@ -28,7 +28,6 @@ import com.bumptech.glide.request.target.DrawableImageViewTarget import com.bumptech.glide.request.target.Target import im.vector.matrix.android.api.session.content.ContentUrlResolver import im.vector.matrix.android.api.util.MatrixItem -import im.vector.matrix.android.internal.util.firstLetterOfDisplayName import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.glide.GlideApp import im.vector.riotx.core.glide.GlideRequest @@ -73,7 +72,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active return if (matrixItem.displayName.isNullOrBlank()) { TextDrawable.builder().buildRound("", avatarColor) } else { - val firstLetter = matrixItem.displayName.firstLetterOfDisplayName() + val firstLetter = matrixItem.firstLetterOfDisplayName() TextDrawable.builder() .beginConfig() .bold() diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt index f4cd81436c..221b078daa 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt @@ -30,7 +30,7 @@ import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.internal.util.firstLetterOfDisplayName +import im.vector.matrix.android.api.util.MatrixItem import im.vector.matrix.rx.rx import im.vector.riotx.core.extensions.postLiveEvent import im.vector.riotx.core.platform.VectorViewModel @@ -142,7 +142,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted session.rx() .searchUsersDirectory(search, 50, emptySet()) .map { users -> - users.sortedBy { it.displayName.firstLetterOfDisplayName() } + users.sortedBy { MatrixItem.from(it).firstLetterOfDisplayName() } } } stream.toAsync { diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt index 6a4fdd553b..437e617bd6 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt @@ -24,7 +24,6 @@ import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.user.model.User import im.vector.matrix.android.api.util.MatrixItem -import im.vector.matrix.android.internal.util.firstLetterOfDisplayName import im.vector.riotx.R import im.vector.riotx.core.epoxy.EmptyItem_ import im.vector.riotx.core.epoxy.loadingItem @@ -87,7 +86,7 @@ class KnownUsersController @Inject constructor(private val session: Session, for (model in models) { if (model is CreateDirectRoomUserItem) { if (model.matrixItem.id == session.myUserId) continue - val currentFirstLetter = model.matrixItem.displayName.firstLetterOfDisplayName() + val currentFirstLetter = model.matrixItem.firstLetterOfDisplayName() val showLetter = !isFiltering && currentFirstLetter.isNotEmpty() && lastFirstLetter != currentFirstLetter lastFirstLetter = currentFirstLetter From 3e4b07cec3cd20486fcd2257afaa0b369b8819cc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Sat, 14 Dec 2019 10:19:11 +0100 Subject: [PATCH 04/11] Do not display " (IRC)") in display names --- CHANGES.md | 1 + .../java/im/vector/matrix/android/api/util/MatrixItem.kt | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index a5953dcb14..e6850ef8c7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,7 @@ Other changes: Bugfix πŸ›: - Scroll breadcrumbs to top when opened - Render default room name when it starts with an emoji (#477) + - Do not display " (IRC)") in display names https://github.com/vector-im/riot-android/issues/444 Translations πŸ—£: - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt index c6d5665d0d..aacb5472d9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -29,8 +29,8 @@ sealed class MatrixItem( ) { data class UserItem(override val id: String, override val displayName: String? = null, - override val avatarUrl: String? = null - ) : MatrixItem(id, displayName, avatarUrl) + override val avatarUrl: String? = null) + : MatrixItem(id, displayName?.removeSuffix(ircPattern), avatarUrl) data class EventItem(override val id: String, override val displayName: String? = null, @@ -59,7 +59,7 @@ sealed class MatrixItem( /** * Return the prefix as defined in the matrix spec (and not extracted from the id) */ - fun getPrefix() = when (this) { + fun getIdPrefix() = when (this) { is UserItem -> '@' is EventItem -> '$' is RoomItem -> '!' @@ -103,6 +103,8 @@ sealed class MatrixItem( companion object { + private const val ircPattern = " (IRC)" + fun from(user: User) = UserItem(user.userId, user.displayName, user.avatarUrl) fun from(groupSummary: GroupSummary) = GroupItem(groupSummary.groupId, groupSummary.displayName, groupSummary.avatarUrl) fun from(roomSummary: RoomSummary) = RoomItem(roomSummary.roomId, roomSummary.displayName, roomSummary.avatarUrl) From 8fc1400bab346e796664f3a5b1992f9eaa7ef775 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Sat, 14 Dec 2019 10:38:50 +0100 Subject: [PATCH 05/11] Improve user color computation and add unit tests --- .../vector/riotx/features/home/RoomColor.kt | 2 +- .../vector/riotx/features/home/UserColor.kt | 30 +++++-------- .../helper/MessageInformationDataFactory.kt | 2 +- .../riotx/features/home/UserColorTest.kt | 42 +++++++++++++++++++ 4 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 vector/src/test/java/im/vector/riotx/features/home/UserColorTest.kt diff --git a/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt b/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt index 48f2e22b6d..0b3fd5396f 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/RoomColor.kt @@ -20,7 +20,7 @@ import androidx.annotation.ColorRes import im.vector.riotx.R @ColorRes -fun getColorFromRoomId(roomId: String? = null): Int { +fun getColorFromRoomId(roomId: String?): Int { return when ((roomId?.toList()?.sumBy { it.toInt() } ?: 0) % 3) { 1 -> R.color.riotx_avatar_fill_2 2 -> R.color.riotx_avatar_fill_3 diff --git a/vector/src/main/java/im/vector/riotx/features/home/UserColor.kt b/vector/src/main/java/im/vector/riotx/features/home/UserColor.kt index a88299cc25..d34ca6506a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/UserColor.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/UserColor.kt @@ -22,28 +22,18 @@ import kotlin.math.abs @ColorRes fun getColorFromUserId(userId: String?): Int { - if (userId.isNullOrBlank()) { - return R.color.riotx_username_1 - } - var hash = 0 - var i = 0 - var chr: Char - while (i < userId.length) { - chr = userId[i] - hash = (hash shl 5) - hash + chr.toInt() - i++ - } + userId?.toList()?.map { chr -> hash = (hash shl 5) - hash + chr.toInt() } - return when (abs(hash) % 8 + 1) { - 1 -> R.color.riotx_username_1 - 2 -> R.color.riotx_username_2 - 3 -> R.color.riotx_username_3 - 4 -> R.color.riotx_username_4 - 5 -> R.color.riotx_username_5 - 6 -> R.color.riotx_username_6 - 7 -> R.color.riotx_username_7 - else -> R.color.riotx_username_8 + return when (abs(hash) % 8) { + 1 -> R.color.riotx_username_2 + 2 -> R.color.riotx_username_3 + 3 -> R.color.riotx_username_4 + 4 -> R.color.riotx_username_5 + 5 -> R.color.riotx_username_6 + 6 -> R.color.riotx_username_7 + 7 -> R.color.riotx_username_8 + else -> R.color.riotx_username_1 } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index 784a180d00..3331fbf774 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -60,7 +60,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses val avatarUrl = event.senderAvatar val memberName = event.getDisambiguatedDisplayName() val formattedMemberName = span(memberName) { - textColor = colorProvider.getColor(getColorFromUserId(event.root.senderId ?: "")) + textColor = colorProvider.getColor(getColorFromUserId(event.root.senderId)) } return MessageInformationData( diff --git a/vector/src/test/java/im/vector/riotx/features/home/UserColorTest.kt b/vector/src/test/java/im/vector/riotx/features/home/UserColorTest.kt new file mode 100644 index 0000000000..e0795afb58 --- /dev/null +++ b/vector/src/test/java/im/vector/riotx/features/home/UserColorTest.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2019 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.riotx.features.home + +import im.vector.riotx.R +import org.junit.Assert.assertEquals +import org.junit.Test + +class UserColorTest { + + @Test + fun testNull() { + assertEquals(R.color.riotx_username_1, getColorFromUserId(null)) + } + + @Test + fun testEmpty() { + assertEquals(R.color.riotx_username_1, getColorFromUserId("")) + } + + @Test + fun testName() { + assertEquals(R.color.riotx_username_1, getColorFromUserId("@ganfra:matrix.org")) + assertEquals(R.color.riotx_username_4, getColorFromUserId("@benoit0816:matrix.org")) + assertEquals(R.color.riotx_username_5, getColorFromUserId("@hubert:uhoreg.ca")) + assertEquals(R.color.riotx_username_7, getColorFromUserId("@nadonomy:matrix.org")) + } +} From 3dfd6f5a69fd87cc197f4e7085f0225ffa425f88 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 10:20:38 +0100 Subject: [PATCH 06/11] Breadcrumbs: increase font size --- vector/src/main/res/layout/item_breadcrumbs.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vector/src/main/res/layout/item_breadcrumbs.xml b/vector/src/main/res/layout/item_breadcrumbs.xml index f364ad8211..a7a312f16b 100644 --- a/vector/src/main/res/layout/item_breadcrumbs.xml +++ b/vector/src/main/res/layout/item_breadcrumbs.xml @@ -40,10 +40,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:minWidth="16dp" - android:minHeight="16dp" + android:minWidth="18dp" + android:minHeight="18dp" android:textColor="@android:color/white" - android:textSize="10sp" + android:textSize="11sp" android:visibility="gone" app:layout_constraintCircle="@+id/breadcrumbsImageView" app:layout_constraintCircleAngle="45" From c9ed95ed21a3e538d9b47f425a3530fde164a105 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 10:46:24 +0100 Subject: [PATCH 07/11] MatrixItem: create extension and check ids --- .../matrix/android/api/util/MatrixItem.kt | 51 +++++++++++++++---- .../core/preference/UserAvatarPreference.kt | 3 +- .../user/AutocompleteUserController.kt | 4 +- .../SASVerificationIncomingFragment.kt | 3 +- .../riotx/features/home/HomeDetailFragment.kt | 4 +- .../riotx/features/home/HomeDrawerFragment.kt | 4 +- .../createdirect/CreateDirectRoomViewModel.kt | 4 +- .../createdirect/DirectoryUsersController.kt | 4 +- .../home/createdirect/KnownUsersController.kt | 4 +- .../features/home/group/GroupListViewModel.kt | 2 +- .../home/group/GroupSummaryController.kt | 4 +- .../room/breadcrumbs/BreadcrumbsController.kt | 4 +- .../home/room/detail/RoomDetailFragment.kt | 5 +- .../home/room/list/RoomSummaryItemFactory.kt | 6 +-- .../RoomListQuickActionsEpoxyController.kt | 4 +- .../riotx/features/invite/VectorInviteView.kt | 4 +- .../roomdirectory/PublicRoomsController.kt | 4 +- .../ignored/IgnoredUsersController.kt | 4 +- 18 files changed, 76 insertions(+), 42 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt index aacb5472d9..a976e60c77 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -16,6 +16,7 @@ package im.vector.matrix.android.api.util +import im.vector.matrix.android.BuildConfig import im.vector.matrix.android.api.session.group.model.GroupSummary import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom @@ -30,32 +31,58 @@ sealed class MatrixItem( data class UserItem(override val id: String, override val displayName: String? = null, override val avatarUrl: String? = null) - : MatrixItem(id, displayName?.removeSuffix(ircPattern), avatarUrl) + : MatrixItem(id, displayName?.removeSuffix(ircPattern), avatarUrl) { + init { + if (BuildConfig.DEBUG) checkId() + } + } data class EventItem(override val id: String, override val displayName: String? = null, override val avatarUrl: String? = null) - : MatrixItem(id, displayName, avatarUrl) + : MatrixItem(id, displayName, avatarUrl) { + init { + if (BuildConfig.DEBUG) checkId() + } + } data class RoomItem(override val id: String, override val displayName: String? = null, override val avatarUrl: String? = null) - : MatrixItem(id, displayName, avatarUrl) + : MatrixItem(id, displayName, avatarUrl) { + init { + if (BuildConfig.DEBUG) checkId() + } + } data class RoomAliasItem(override val id: String, override val displayName: String? = null, override val avatarUrl: String? = null) - : MatrixItem(id, displayName, avatarUrl) + : MatrixItem(id, displayName, avatarUrl) { + init { + if (BuildConfig.DEBUG) checkId() + } + } data class GroupItem(override val id: String, override val displayName: String? = null, override val avatarUrl: String? = null) - : MatrixItem(id, displayName, avatarUrl) + : MatrixItem(id, displayName, avatarUrl) { + init { + if (BuildConfig.DEBUG) checkId() + } + } fun getBestName(): String { return displayName?.takeIf { it.isNotBlank() } ?: id } + protected fun checkId() { + if (!id.startsWith(getIdPrefix())) { + error("Wrong usage of MatrixItem: check the id $id should start with ${getIdPrefix()}") + } + } + /** * Return the prefix as defined in the matrix spec (and not extracted from the id) */ @@ -104,10 +131,14 @@ sealed class MatrixItem( companion object { private const val ircPattern = " (IRC)" - - fun from(user: User) = UserItem(user.userId, user.displayName, user.avatarUrl) - fun from(groupSummary: GroupSummary) = GroupItem(groupSummary.groupId, groupSummary.displayName, groupSummary.avatarUrl) - fun from(roomSummary: RoomSummary) = RoomItem(roomSummary.roomId, roomSummary.displayName, roomSummary.avatarUrl) - fun from(publicRoom: PublicRoom) = RoomItem(publicRoom.roomId, publicRoom.name, publicRoom.avatarUrl) } } + +/* ========================================================================================== + * Extensions to create MatrixItem + * ========================================================================================== */ + +fun User.toMatrixItem() = MatrixItem.UserItem(userId, displayName, avatarUrl) +fun GroupSummary.toMatrixItem() = MatrixItem.GroupItem(groupId, displayName, avatarUrl) +fun RoomSummary.toMatrixItem() = MatrixItem.RoomItem(roomId, displayName, avatarUrl) +fun PublicRoom.toMatrixItem() = MatrixItem.RoomItem(roomId, name, avatarUrl) diff --git a/vector/src/main/java/im/vector/riotx/core/preference/UserAvatarPreference.kt b/vector/src/main/java/im/vector/riotx/core/preference/UserAvatarPreference.kt index ef0541ce13..c7fcf85a16 100755 --- a/vector/src/main/java/im/vector/riotx/core/preference/UserAvatarPreference.kt +++ b/vector/src/main/java/im/vector/riotx/core/preference/UserAvatarPreference.kt @@ -24,6 +24,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceViewHolder import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.vectorComponent import im.vector.riotx.features.home.AvatarRenderer @@ -60,7 +61,7 @@ open class UserAvatarPreference : Preference { val session = mSession ?: return val view = mAvatarView ?: return session.getUser(session.myUserId)?.let { - avatarRenderer.render(MatrixItem.from(it), view) + avatarRenderer.render(it.toMatrixItem(), view) } ?: run { avatarRenderer.render(MatrixItem.UserItem(session.myUserId), view) } diff --git a/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserController.kt b/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserController.kt index fa264e9200..8f0090001f 100644 --- a/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserController.kt +++ b/vector/src/main/java/im/vector/riotx/features/autocomplete/user/AutocompleteUserController.kt @@ -18,7 +18,7 @@ package im.vector.riotx.features.autocomplete.user import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.features.autocomplete.AutocompleteClickListener import im.vector.riotx.features.home.AvatarRenderer import javax.inject.Inject @@ -36,7 +36,7 @@ class AutocompleteUserController @Inject constructor() : TypedEpoxyController
  • autocompleteUserItem { id(user.userId) - matrixItem(MatrixItem.from(user)) + matrixItem(user.toMatrixItem()) avatarRenderer(avatarRenderer) clickListener { _ -> listener?.onItemClick(user) diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt index 47d7e783b4..61f5c5f9fe 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/SASVerificationIncomingFragment.kt @@ -23,6 +23,7 @@ import butterknife.BindView import butterknife.OnClick import im.vector.matrix.android.api.session.crypto.sas.IncomingSasVerificationTransaction import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.home.AvatarRenderer @@ -58,7 +59,7 @@ class SASVerificationIncomingFragment @Inject constructor( otherDeviceTextView.text = viewModel.otherDeviceId viewModel.otherUser?.let { - avatarRenderer.render(MatrixItem.from(it), avatarImageView) + avatarRenderer.render(it.toMatrixItem(), avatarImageView) } ?: run { // Fallback to what we know avatarRenderer.render(MatrixItem.UserItem(viewModel.otherUserId ?: "", viewModel.otherUserId), avatarImageView) diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt index d844d0a2f0..fc0eeaf92c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeDetailFragment.kt @@ -27,7 +27,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationItemView import com.google.android.material.bottomnavigation.BottomNavigationMenuView import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState import im.vector.matrix.android.api.session.group.model.GroupSummary -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.commitTransactionNow import im.vector.riotx.core.platform.ToolbarConfigurable @@ -75,7 +75,7 @@ class HomeDetailFragment @Inject constructor( private fun onGroupChange(groupSummary: GroupSummary?) { groupSummary?.let { - avatarRenderer.render(MatrixItem.from(it), groupToolbarAvatarImageView) + avatarRenderer.render(it.toMatrixItem(), groupToolbarAvatarImageView) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt index 32344db2df..6ff836e8c8 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeDrawerFragment.kt @@ -19,7 +19,7 @@ package im.vector.riotx.features.home import android.os.Bundle import android.view.View import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.observeK import im.vector.riotx.core.extensions.replaceChildFragment @@ -43,7 +43,7 @@ class HomeDrawerFragment @Inject constructor( session.liveUser(session.myUserId).observeK(this) { optionalUser -> val user = optionalUser?.getOrNull() if (user != null) { - avatarRenderer.render(MatrixItem.from(user), homeDrawerHeaderAvatarView) + avatarRenderer.render(user.toMatrixItem(), homeDrawerHeaderAvatarView) homeDrawerUsernameView.text = user.displayName homeDrawerUserIdView.text = user.userId } diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt index 221b078daa..b71b0cd9d0 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/CreateDirectRoomViewModel.kt @@ -30,7 +30,7 @@ import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.matrix.rx.rx import im.vector.riotx.core.extensions.postLiveEvent import im.vector.riotx.core.platform.VectorViewModel @@ -142,7 +142,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted session.rx() .searchUsersDirectory(search, 50, emptySet()) .map { users -> - users.sortedBy { MatrixItem.from(it).firstLetterOfDisplayName() } + users.sortedBy { it.toMatrixItem().firstLetterOfDisplayName() } } } stream.toAsync { diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/DirectoryUsersController.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/DirectoryUsersController.kt index c11260a296..8d2b3928be 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/DirectoryUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/DirectoryUsersController.kt @@ -25,7 +25,7 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.errorWithRetryItem import im.vector.riotx.core.epoxy.loadingItem @@ -98,7 +98,7 @@ class DirectoryUsersController @Inject constructor(private val session: Session, createDirectRoomUserItem { id(user.userId) selected(isSelected) - matrixItem(MatrixItem.from(user)) + matrixItem(user.toMatrixItem()) avatarRenderer(avatarRenderer) clickListener { _ -> callback?.onItemClick(user) diff --git a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt index 437e617bd6..8270683975 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/createdirect/KnownUsersController.kt @@ -23,7 +23,7 @@ import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.EmptyItem_ import im.vector.riotx.core.epoxy.loadingItem @@ -68,7 +68,7 @@ class KnownUsersController @Inject constructor(private val session: Session, CreateDirectRoomUserItem_() .id(item.userId) .selected(isSelected) - .matrixItem(MatrixItem.from(item)) + .matrixItem(item.toMatrixItem()) .avatarRenderer(avatarRenderer) .clickListener { _ -> callback?.onItemClick(item) diff --git a/vector/src/main/java/im/vector/riotx/features/home/group/GroupListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/group/GroupListViewModel.kt index d9a38d5d9b..bbeda127fc 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/group/GroupListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/group/GroupListViewModel.kt @@ -36,7 +36,7 @@ import im.vector.riotx.core.utils.LiveEvent import io.reactivex.Observable import io.reactivex.functions.BiFunction -const val ALL_COMMUNITIES_GROUP_ID = "ALL_COMMUNITIES_GROUP_ID" +const val ALL_COMMUNITIES_GROUP_ID = "+ALL_COMMUNITIES_GROUP_ID" class GroupListViewModel @AssistedInject constructor(@Assisted initialState: GroupListViewState, private val selectedGroupStore: SelectedGroupDataSource, diff --git a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt index 4e98ddb412..95054d1689 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/group/GroupSummaryController.kt @@ -18,7 +18,7 @@ package im.vector.riotx.features.home.group import com.airbnb.epoxy.EpoxyController import im.vector.matrix.android.api.session.group.model.GroupSummary -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.features.home.AvatarRenderer import javax.inject.Inject @@ -50,7 +50,7 @@ class GroupSummaryController @Inject constructor(private val avatarRenderer: Ava groupSummaryItem { avatarRenderer(avatarRenderer) id(groupSummary.groupId) - matrixItem(MatrixItem.from(groupSummary)) + matrixItem(groupSummary.toMatrixItem()) selected(isSelected) listener { callback?.onGroupSelected(groupSummary) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt index a3e46d3197..bfc91bf5a1 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsController.kt @@ -18,7 +18,7 @@ package im.vector.riotx.features.home.room.breadcrumbs import android.view.View import com.airbnb.epoxy.EpoxyController -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.features.home.AvatarRenderer import javax.inject.Inject @@ -53,7 +53,7 @@ class BreadcrumbsController @Inject constructor( breadcrumbsItem { id(it.roomId) avatarRenderer(avatarRenderer) - matrixItem(MatrixItem.from(it)) + matrixItem(it.toMatrixItem()) unreadNotificationCount(it.notificationCount) showHighlighted(it.highlightCount > 0) hasUnreadMessage(it.hasUnreadMessages) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index fd72e85199..cd9287f7d1 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -67,6 +67,7 @@ import im.vector.matrix.android.api.session.room.timeline.TimelineEvent import im.vector.matrix.android.api.session.room.timeline.getLastMessageContent import im.vector.matrix.android.api.session.user.model.User import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.dialogs.withColoredButton import im.vector.riotx.core.epoxy.LayoutManagerStateRestorer @@ -600,7 +601,7 @@ class RoomDetailFragment @Inject constructor( } // Replace the word by its completion - val matrixItem = MatrixItem.from(item) + val matrixItem = item.toMatrixItem() val displayName = matrixItem.getBestName() // with a trailing space @@ -711,7 +712,7 @@ class RoomDetailFragment @Inject constructor( activity?.finish() } else { roomToolbarTitleView.text = it.displayName - avatarRenderer.render(MatrixItem.from(it), roomToolbarAvatarImageView) + avatarRenderer.render(it.toMatrixItem(), roomToolbarAvatarImageView) roomToolbarSubtitleView.setTextOrHide(it.topic) } jumpToBottomView.count = it.notificationCount diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt index 96c8673ca7..84a5f942e8 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomSummaryItemFactory.kt @@ -21,7 +21,7 @@ import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.timeline.getLastMessageContent -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.date.VectorDateFormatter import im.vector.riotx.core.epoxy.VectorEpoxyModel @@ -70,7 +70,7 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte return RoomInvitationItem_() .id(roomSummary.roomId) .avatarRenderer(avatarRenderer) - .matrixItem(MatrixItem.from(roomSummary)) + .matrixItem(roomSummary.toMatrixItem()) .secondLine(secondLine) .invitationAcceptInProgress(joiningRoomsIds.contains(roomSummary.roomId)) .invitationAcceptInError(joiningErrorRoomsIds.contains(roomSummary.roomId)) @@ -124,7 +124,7 @@ class RoomSummaryItemFactory @Inject constructor(private val noticeEventFormatte return RoomSummaryItem_() .id(roomSummary.roomId) .avatarRenderer(avatarRenderer) - .matrixItem(MatrixItem.from(roomSummary)) + .matrixItem(roomSummary.toMatrixItem()) .lastEventTime(latestEventTime) .lastFormattedEvent(latestFormattedEvent) .showHighlighted(showHighlighted) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt index 559dfd7301..8d25f5713a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt @@ -18,7 +18,7 @@ package im.vector.riotx.features.home.room.list.actions import android.view.View import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.room.notification.RoomNotificationState -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetActionItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetRoomPreviewItem import im.vector.riotx.core.epoxy.bottomsheet.bottomSheetSeparatorItem @@ -40,7 +40,7 @@ class RoomListQuickActionsEpoxyController @Inject constructor(private val avatar bottomSheetRoomPreviewItem { id("preview") avatarRenderer(avatarRenderer) - matrixItem(MatrixItem.from(roomSummary)) + matrixItem(roomSummary.toMatrixItem()) settingsClickListener(View.OnClickListener { listener?.didSelectMenuAction(RoomListQuickActionsSharedAction.Settings(roomSummary.roomId)) }) } diff --git a/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt b/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt index 56217d9980..b9bd9b0e1e 100644 --- a/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt +++ b/vector/src/main/java/im/vector/riotx/features/invite/VectorInviteView.kt @@ -22,7 +22,7 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.updateLayoutParams import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.di.HasScreenInjector import im.vector.riotx.features.home.AvatarRenderer @@ -57,7 +57,7 @@ class VectorInviteView @JvmOverloads constructor(context: Context, attrs: Attrib fun render(sender: User, mode: Mode = Mode.LARGE) { if (mode == Mode.LARGE) { updateLayoutParams { height = LayoutParams.MATCH_CONSTRAINT } - avatarRenderer.render(MatrixItem.from(sender), inviteAvatarView) + avatarRenderer.render(sender.toMatrixItem(), inviteAvatarView) inviteIdentifierView.text = sender.userId inviteNameView.text = sender.displayName inviteLabelView.text = context.getString(R.string.send_you_invite) diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt index 97952059ce..83a1768843 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/PublicRoomsController.kt @@ -22,7 +22,7 @@ import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Success import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.errorWithRetryItem import im.vector.riotx.core.epoxy.loadingItem @@ -84,7 +84,7 @@ class PublicRoomsController @Inject constructor(private val stringProvider: Stri publicRoomItem { avatarRenderer(avatarRenderer) id(publicRoom.roomId) - matrixItem(MatrixItem.from(publicRoom)) + matrixItem(publicRoom.toMatrixItem()) roomAlias(publicRoom.canonicalAlias) roomTopic(publicRoom.topic) nbOfMembers(publicRoom.numJoinedMembers) diff --git a/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt b/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt index 18f256a207..5f4158b542 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/ignored/IgnoredUsersController.kt @@ -18,7 +18,7 @@ package im.vector.riotx.features.settings.ignored import com.airbnb.epoxy.EpoxyController import im.vector.matrix.android.api.session.user.model.User -import im.vector.matrix.android.api.util.MatrixItem +import im.vector.matrix.android.api.util.toMatrixItem import im.vector.riotx.R import im.vector.riotx.core.epoxy.noResultItem import im.vector.riotx.core.resources.StringProvider @@ -56,7 +56,7 @@ class IgnoredUsersController @Inject constructor(private val stringProvider: Str userItem { id(user.userId) avatarRenderer(avatarRenderer) - matrixItem(MatrixItem.from(user)) + matrixItem(user.toMatrixItem()) itemClickAction { callback?.onUserIdClicked(user.userId) } } } From cecef5b8da296df51d3b51f96da4532b4b2553a2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 10:56:25 +0100 Subject: [PATCH 08/11] Use id to get first letter, if display name is empty --- .../java/im/vector/matrix/android/api/util/MatrixItem.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt index a976e60c77..40d72333f2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -95,9 +95,8 @@ sealed class MatrixItem( } fun firstLetterOfDisplayName(): String { - return displayName - ?.takeIf { it.isNotBlank() } - ?.let { dn -> + return getBestName() + .let { dn -> var startIndex = 0 val initial = dn[startIndex] @@ -124,8 +123,7 @@ sealed class MatrixItem( dn.substring(startIndex, startIndex + length) } - ?.toUpperCase(Locale.ROOT) - ?: " " + .toUpperCase(Locale.ROOT) } From 0a0eda3e342d2858cb4ce695deb8e65af58512de Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 11:08:48 +0100 Subject: [PATCH 09/11] Display first letter of id if display name is empty --- .../vector/riotx/features/home/AvatarRenderer.kt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt index ae02ce6519..4e1808a48a 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/AvatarRenderer.kt @@ -69,16 +69,11 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active is MatrixItem.UserItem -> ContextCompat.getColor(context, getColorFromUserId(matrixItem.id)) else -> ContextCompat.getColor(context, getColorFromRoomId(matrixItem.id)) } - return if (matrixItem.displayName.isNullOrBlank()) { - TextDrawable.builder().buildRound("", avatarColor) - } else { - val firstLetter = matrixItem.firstLetterOfDisplayName() - TextDrawable.builder() - .beginConfig() - .bold() - .endConfig() - .buildRound(firstLetter, avatarColor) - } + return TextDrawable.builder() + .beginConfig() + .bold() + .endConfig() + .buildRound(matrixItem.firstLetterOfDisplayName(), avatarColor) } // PRIVATE API ********************************************************************************* From 7d910f256660f1007c44aeadf5c0525c722dabe6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 11:30:53 +0100 Subject: [PATCH 10/11] Auto review --- .../java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt | 7 ++----- .../detail/readreceipts/DisplayReadReceiptsController.kt | 4 ++-- .../home/room/detail/timeline/item/MergedHeaderItem.kt | 4 +++- .../room/detail/timeline/item/MessageInformationData.kt | 5 +++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt index ac67f6c6cb..c5e2fdf375 100644 --- a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt +++ b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt @@ -22,11 +22,11 @@ import android.view.View import android.widget.ImageView import android.widget.LinearLayout import androidx.core.view.isVisible -import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.glide.GlideApp import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData +import im.vector.riotx.features.home.room.detail.timeline.item.toMatrixItem import kotlinx.android.synthetic.main.view_read_receipts.view.* private const val MAX_RECEIPT_DISPLAYED = 5 @@ -60,10 +60,7 @@ class ReadReceiptsView @JvmOverloads constructor( receiptAvatars[index].visibility = View.INVISIBLE } else { receiptAvatars[index].visibility = View.VISIBLE - avatarRenderer.render( - MatrixItem.UserItem(receiptData.userId, receiptData.displayName, receiptData.avatarUrl), - receiptAvatars[index] - ) + avatarRenderer.render(receiptData.toMatrixItem(), receiptAvatars[index]) } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt index ef7dba5caf..3ec60217a0 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt @@ -18,10 +18,10 @@ package im.vector.riotx.features.home.room.detail.readreceipts import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.core.date.VectorDateFormatter import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData +import im.vector.riotx.features.home.room.detail.timeline.item.toMatrixItem import javax.inject.Inject /** @@ -37,7 +37,7 @@ class DisplayReadReceiptsController @Inject constructor(private val dateFormatte val timestamp = dateFormatter.formatRelativeDateTime(it.timestamp) DisplayReadReceiptItem_() .id(it.userId) - .matrixItem(MatrixItem.UserItem(it.userId, it.displayName, it.avatarUrl)) + .matrixItem(it.toMatrixItem()) .avatarRenderer(avatarRender) .timestamp(timestamp) .addIf(session.myUserId != it.userId, this) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt index 728c8cd740..93f7dc271d 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MergedHeaderItem.kt @@ -55,7 +55,7 @@ abstract class MergedHeaderItem : BaseEventItem() { val data = distinctMergeData.getOrNull(index) if (data != null && view is ImageView) { view.visibility = View.VISIBLE - attributes.avatarRenderer.render(MatrixItem.UserItem(data.userId, data.memberName, data.avatarUrl), view) + attributes.avatarRenderer.render(data.toMatrixItem(), view) } else { view.visibility = View.GONE } @@ -88,6 +88,8 @@ abstract class MergedHeaderItem : BaseEventItem() { val avatarUrl: String? ) + fun Data.toMatrixItem() = MatrixItem.UserItem(userId, memberName, avatarUrl) + data class Attributes( val isCollapsed: Boolean, val mergeData: List, diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt index ffaec7dd48..604a57907e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt @@ -37,8 +37,7 @@ data class MessageInformationData( val readReceipts: List = emptyList() ) : Parcelable { - val matrixItem: MatrixItem - get() = MatrixItem.UserItem(senderId, memberName?.toString(), avatarUrl) + val matrixItem = MatrixItem.UserItem(senderId, memberName?.toString(), avatarUrl) } @Parcelize @@ -56,3 +55,5 @@ data class ReadReceiptData( val displayName: String?, val timestamp: Long ) : Parcelable + +fun ReadReceiptData.toMatrixItem() = MatrixItem.UserItem(userId, displayName, avatarUrl) From 9fc3093c2caa1ce1bbf401aa8e28b04c57ac966b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 16 Dec 2019 12:39:51 +0100 Subject: [PATCH 11/11] Fix issues... --- .../java/im/vector/matrix/android/api/util/MatrixItem.kt | 1 - .../room/detail/timeline/item/MessageInformationData.kt | 3 ++- .../roomdirectory/roompreview/RoomPreviewActivity.kt | 6 +++++- .../roompreview/RoomPreviewNoPreviewFragment.kt | 5 ++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt index 40d72333f2..4fed773ae2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/util/MatrixItem.kt @@ -126,7 +126,6 @@ sealed class MatrixItem( .toUpperCase(Locale.ROOT) } - companion object { private const val ircPattern = " (IRC)" } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt index 604a57907e..d1ceb56e3c 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/timeline/item/MessageInformationData.kt @@ -37,7 +37,8 @@ data class MessageInformationData( val readReceipts: List = emptyList() ) : Parcelable { - val matrixItem = MatrixItem.UserItem(senderId, memberName?.toString(), avatarUrl) + val matrixItem: MatrixItem + get() = MatrixItem.UserItem(senderId, memberName?.toString(), avatarUrl) } @Parcelize diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewActivity.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewActivity.kt index 1bd138552e..0fdb504c23 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewActivity.kt @@ -21,6 +21,7 @@ import android.content.Intent import android.os.Parcelable import androidx.appcompat.widget.Toolbar import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom +import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.extensions.addFragment import im.vector.riotx.core.platform.ToolbarConfigurable @@ -34,7 +35,10 @@ data class RoomPreviewData( val topic: String?, val worldReadable: Boolean, val avatarUrl: String? -) : Parcelable +) : Parcelable { + val matrixItem: MatrixItem + get() = MatrixItem.RoomItem(roomId, roomName, avatarUrl) +} class RoomPreviewActivity : VectorBaseActivity(), ToolbarConfigurable { diff --git a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt index e3a1830965..088e05c152 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomdirectory/roompreview/RoomPreviewNoPreviewFragment.kt @@ -23,7 +23,6 @@ import androidx.transition.TransitionManager import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState -import im.vector.matrix.android.api.util.MatrixItem import im.vector.riotx.R import im.vector.riotx.core.error.ErrorFormatter import im.vector.riotx.core.extensions.setTextOrHide @@ -52,11 +51,11 @@ class RoomPreviewNoPreviewFragment @Inject constructor( super.onViewCreated(view, savedInstanceState) setupToolbar(roomPreviewNoPreviewToolbar) // Toolbar - avatarRenderer.render(MatrixItem.RoomItem(roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewData.avatarUrl), roomPreviewNoPreviewToolbarAvatar) + avatarRenderer.render(roomPreviewData.matrixItem, roomPreviewNoPreviewToolbarAvatar) roomPreviewNoPreviewToolbarTitle.text = roomPreviewData.roomName // Screen - avatarRenderer.render(MatrixItem.RoomItem(roomPreviewData.roomId, roomPreviewData.roomName, roomPreviewData.avatarUrl), roomPreviewNoPreviewAvatar) + avatarRenderer.render(roomPreviewData.matrixItem, roomPreviewNoPreviewAvatar) roomPreviewNoPreviewName.text = roomPreviewData.roomName roomPreviewNoPreviewTopic.setTextOrHide(roomPreviewData.topic)