From 5a6683574ce2950f94b406d5c0828dc414673ea3 Mon Sep 17 00:00:00 2001 From: Benoit Marty <benoit@matrix.org> Date: Fri, 23 Oct 2020 14:58:31 +0200 Subject: [PATCH] Toggle Low priority tag (#1490) --- CHANGES.md | 1 + .../sdk/api/session/room/model/RoomSummary.kt | 7 +++++- .../bottomsheet/BottomSheetRoomPreviewItem.kt | 22 +++++++++++++++++++ .../features/home/room/list/RoomListAction.kt | 2 +- .../home/room/list/RoomListFragment.kt | 6 ++++- .../home/room/list/RoomListViewModel.kt | 12 +++++----- .../RoomListQuickActionsBottomSheet.kt | 5 +++-- .../RoomListQuickActionsEpoxyController.kt | 2 ++ .../RoomListQuickActionsSharedAction.kt | 4 ++++ .../main/res/drawable/ic_low_priority_24.xml | 10 +++++++++ .../layout/item_bottom_sheet_room_preview.xml | 15 ++++++++++++- vector/src/main/res/values/strings.xml | 2 ++ 12 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 vector/src/main/res/drawable/ic_low_priority_24.xml diff --git a/CHANGES.md b/CHANGES.md index d7bd5da965..563fee9c43 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ Features ✨: Improvements 🙌: - Rework sending Event management (#154) - New room creation screen: set topic and avatar in the room creation form (#2078) + - Toggle Low priority tag (#1490) Bugfix 🐛: - Messages encrypted with no way to decrypt after SDK update from 0.18 to 1.0.0 (#2252) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt index f170c098bc..9455a83aff 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomSummary.kt @@ -63,8 +63,13 @@ data class RoomSummary constructor( val hasNewMessages: Boolean get() = notificationCount != 0 + val isLowPriority: Boolean + get() = hasTag(RoomTag.ROOM_TAG_LOW_PRIORITY) + val isFavorite: Boolean - get() = tags.any { it.name == RoomTag.ROOM_TAG_FAVOURITE } + get() = hasTag(RoomTag.ROOM_TAG_FAVOURITE) + + fun hasTag(tag: String) = tags.any { it.name == tag } val canStartCall: Boolean get() = joinedMembersCount == 2 diff --git a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetRoomPreviewItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetRoomPreviewItem.kt index a495f14b6e..105388d87b 100644 --- a/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetRoomPreviewItem.kt +++ b/vector/src/main/java/im/vector/app/core/epoxy/bottomsheet/BottomSheetRoomPreviewItem.kt @@ -44,8 +44,10 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer @EpoxyAttribute lateinit var matrixItem: MatrixItem @EpoxyAttribute lateinit var stringProvider: StringProvider + @EpoxyAttribute var izLowPriority: Boolean = false @EpoxyAttribute var izFavorite: Boolean = false @EpoxyAttribute var settingsClickListener: ClickListener? = null + @EpoxyAttribute var lowPriorityClickListener: ClickListener? = null @EpoxyAttribute var favoriteClickListener: ClickListener? = null override fun bind(holder: Holder) { @@ -53,8 +55,15 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev avatarRenderer.render(matrixItem, holder.avatar) holder.avatar.onClick(settingsClickListener) holder.roomName.setTextOrHide(matrixItem.displayName) + setLowPriorityState(holder, izLowPriority) setFavoriteState(holder, izFavorite) + holder.roomLowPriority.setOnClickListener { + // Immediate echo + setLowPriorityState(holder, !izLowPriority) + // And do the action + lowPriorityClickListener?.invoke() + } holder.roomFavorite.setOnClickListener { // Immediate echo setFavoriteState(holder, !izFavorite) @@ -64,6 +73,18 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev holder.roomSettings.onClick(settingsClickListener) } + private fun setLowPriorityState(holder: Holder, isLowPriority: Boolean) { + val tintColor: Int + if (isLowPriority) { + holder.roomLowPriority.contentDescription = stringProvider.getString(R.string.room_list_quick_actions_low_priority_remove) + tintColor = ContextCompat.getColor(holder.view.context, R.color.riotx_accent) + } else { + holder.roomLowPriority.contentDescription = stringProvider.getString(R.string.room_list_quick_actions_low_priority_add) + tintColor = ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary) + } + ImageViewCompat.setImageTintList(holder.roomLowPriority, ColorStateList.valueOf(tintColor)) + } + private fun setFavoriteState(holder: Holder, isFavorite: Boolean) { val tintColor: Int if (isFavorite) { @@ -81,6 +102,7 @@ abstract class BottomSheetRoomPreviewItem : VectorEpoxyModel<BottomSheetRoomPrev class Holder : VectorEpoxyHolder() { val avatar by bind<ImageView>(R.id.bottomSheetRoomPreviewAvatar) val roomName by bind<TextView>(R.id.bottomSheetRoomPreviewName) + val roomLowPriority by bind<ImageView>(R.id.bottomSheetRoomPreviewLowPriority) val roomFavorite by bind<ImageView>(R.id.bottomSheetRoomPreviewFavorite) val roomSettings by bind<View>(R.id.bottomSheetRoomPreviewSettings) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListAction.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListAction.kt index 1b05c3f2fd..4a6c1c16fc 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListAction.kt @@ -27,7 +27,7 @@ sealed class RoomListAction : VectorViewModelAction { data class RejectInvitation(val roomSummary: RoomSummary) : RoomListAction() data class FilterWith(val filter: String) : RoomListAction() data class ChangeRoomNotificationState(val roomId: String, val notificationState: RoomNotificationState) : RoomListAction() - data class ToggleFavorite(val roomId: String) : RoomListAction() + data class ToggleTag(val roomId: String, val tag: String) : RoomListAction() data class LeaveRoom(val roomId: String) : RoomListAction() object MarkAllRoomsRead : RoomListAction() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt index aa10196956..f1d35a74d5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt @@ -52,6 +52,7 @@ import kotlinx.android.synthetic.main.fragment_room_list.* import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.model.tag.RoomTag import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState import javax.inject.Inject @@ -233,7 +234,10 @@ class RoomListFragment @Inject constructor( navigator.openRoomProfile(requireActivity(), quickAction.roomId) } is RoomListQuickActionsSharedAction.Favorite -> { - roomListViewModel.handle(RoomListAction.ToggleFavorite(quickAction.roomId)) + roomListViewModel.handle(RoomListAction.ToggleTag(quickAction.roomId, RoomTag.ROOM_TAG_FAVOURITE)) + } + is RoomListQuickActionsSharedAction.LowPriority -> { + roomListViewModel.handle(RoomListAction.ToggleTag(quickAction.roomId, RoomTag.ROOM_TAG_LOW_PRIORITY)) } is RoomListQuickActionsSharedAction.Leave -> { AlertDialog.Builder(requireContext()) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index d94a8010ba..3263fb9e03 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -70,7 +70,7 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, is RoomListAction.MarkAllRoomsRead -> handleMarkAllRoomsRead() is RoomListAction.LeaveRoom -> handleLeaveRoom(action) is RoomListAction.ChangeRoomNotificationState -> handleChangeNotificationMode(action) - is RoomListAction.ToggleFavorite -> handleToggleFavorite(action) + is RoomListAction.ToggleTag -> handleToggleTag(action) }.exhaustive } @@ -172,18 +172,18 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, }) } - private fun handleToggleFavorite(action: RoomListAction.ToggleFavorite) { + private fun handleToggleTag(action: RoomListAction.ToggleTag) { session.getRoom(action.roomId)?.let { val callback = object : MatrixCallback<Unit> { override fun onFailure(failure: Throwable) { _viewEvents.post(RoomListViewEvents.Failure(failure)) } } - if (it.roomSummary()?.isFavorite == false) { - // Set favorite tag. We do not handle the order for the moment - it.addTag(RoomTag.ROOM_TAG_FAVOURITE, 0.5, callback) + if (it.roomSummary()?.hasTag(action.tag) == false) { + // Set the tag. We do not handle the order for the moment + it.addTag(action.tag, 0.5, callback) } else { - it.deleteTag(RoomTag.ROOM_TAG_FAVOURITE, callback) + it.deleteTag(action.tag, callback) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt index ccd38125f9..e3a5db4b97 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsBottomSheet.kt @@ -89,8 +89,9 @@ class RoomListQuickActionsBottomSheet : VectorBaseBottomSheetDialogFragment(), R sharedActionViewModel.post(quickAction) // Do not dismiss for all the actions when (quickAction) { - is RoomListQuickActionsSharedAction.Favorite -> Unit - else -> dismiss() + is RoomListQuickActionsSharedAction.LowPriority -> Unit + is RoomListQuickActionsSharedAction.Favorite -> Unit + else -> dismiss() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt index ed52dcfdad..ebacdbd1eb 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsEpoxyController.kt @@ -47,9 +47,11 @@ class RoomListQuickActionsEpoxyController @Inject constructor( avatarRenderer(avatarRenderer) matrixItem(roomSummary.toMatrixItem()) stringProvider(stringProvider) + izLowPriority(roomSummary.isLowPriority) izFavorite(roomSummary.isFavorite) settingsClickListener { listener?.didSelectMenuAction(RoomListQuickActionsSharedAction.Settings(roomSummary.roomId)) } favoriteClickListener { listener?.didSelectMenuAction(RoomListQuickActionsSharedAction.Favorite(roomSummary.roomId)) } + lowPriorityClickListener { listener?.didSelectMenuAction(RoomListQuickActionsSharedAction.LowPriority(roomSummary.roomId)) } } // Notifications diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt index 5ef705d5b0..075dca0c52 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt @@ -52,6 +52,10 @@ sealed class RoomListQuickActionsSharedAction( R.drawable.ic_room_actions_settings ) + data class LowPriority(val roomId: String) : RoomListQuickActionsSharedAction( + R.string.room_list_quick_actions_low_priority_add, + R.drawable.ic_low_priority_24) + data class Favorite(val roomId: String) : RoomListQuickActionsSharedAction( R.string.room_list_quick_actions_favorite_add, R.drawable.ic_star_24dp) diff --git a/vector/src/main/res/drawable/ic_low_priority_24.xml b/vector/src/main/res/drawable/ic_low_priority_24.xml new file mode 100644 index 0000000000..5beef2f58e --- /dev/null +++ b/vector/src/main/res/drawable/ic_low_priority_24.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M13.6185,0.6704C12.7246,-0.2235 11.2754,-0.2235 10.3815,0.6704L0.6704,10.3815C-0.2235,11.2754 -0.2235,12.7246 0.6704,13.6185L10.3815,23.3296C11.2754,24.2235 12.7246,24.2235 13.6185,23.3296L23.3296,13.6185C24.2235,12.7246 24.2235,11.2754 23.3296,10.3815L13.6185,0.6704ZM11.9999,5C12.5522,5 12.9999,5.4477 12.9999,6V15.5564L15.7781,12.7782C16.1686,12.3877 16.8018,12.3877 17.1923,12.7782C17.5829,13.1687 17.5829,13.8019 17.1923,14.1924L12.8362,18.5486C12.6574,18.8205 12.3496,19 11.9999,19C11.7189,19 11.465,18.8841 11.2833,18.6974L11.2782,18.6924L6.7782,14.1924C6.3877,13.8019 6.3877,13.1687 6.7782,12.7782C7.1688,12.3877 7.8019,12.3877 8.1925,12.7782L10.9999,15.5857V6C10.9999,5.4477 11.4477,5 11.9999,5Z" + android:fillColor="#000000" + android:fillType="evenOdd"/> +</vector> diff --git a/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml b/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml index 74781468b2..fbd7e45d4f 100644 --- a/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml +++ b/vector/src/main/res/layout/item_bottom_sheet_room_preview.xml @@ -38,11 +38,24 @@ android:textSize="14sp" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/bottomSheetRoomPreviewAvatar" - app:layout_constraintEnd_toStartOf="@+id/bottomSheetRoomPreviewFavorite" + app:layout_constraintEnd_toStartOf="@+id/bottomSheetRoomPreviewLowPriority" app:layout_constraintStart_toEndOf="@id/bottomSheetRoomPreviewAvatar" app:layout_constraintTop_toTopOf="@id/bottomSheetRoomPreviewAvatar" tools:text="@tools:sample/full_names" /> + <ImageView + android:id="@+id/bottomSheetRoomPreviewLowPriority" + android:layout_width="48dp" + android:layout_height="48dp" + android:background="?attr/selectableItemBackground" + android:scaleType="centerInside" + android:src="@drawable/ic_low_priority_24" + app:layout_constraintBottom_toBottomOf="@+id/bottomSheetRoomPreviewAvatar" + app:layout_constraintEnd_toStartOf="@+id/bottomSheetRoomPreviewFavorite" + app:layout_constraintTop_toTopOf="@id/bottomSheetRoomPreviewAvatar" + tools:contentDescription="@string/room_list_quick_actions_low_priority_add" + tools:tint="?riotx_text_secondary" /> + <ImageView android:id="@+id/bottomSheetRoomPreviewFavorite" android:layout_width="48dp" diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 349698cb31..c1f5a3d041 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1883,6 +1883,8 @@ <string name="room_list_quick_actions_settings">"Settings"</string> <string name="room_list_quick_actions_favorite_add">"Add to favorites"</string> <string name="room_list_quick_actions_favorite_remove">"Remove from favorites"</string> + <string name="room_list_quick_actions_low_priority_add">"Add to low priority"</string> + <string name="room_list_quick_actions_low_priority_remove">"Remove from low priority"</string> <string name="room_list_quick_actions_leave">"Leave the room"</string> <string name="notice_member_no_changes">"%1$s made no changes"</string> <string name="notice_member_no_changes_by_you">"You made no changes"</string>