From 0d0b6a88100fb9d10fc878900332067e7eec2305 Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 14 May 2021 13:10:13 +0200 Subject: [PATCH 1/5] Fix empty states for spaces --- .../ui/list/GenericEmptyWithActionItem.kt | 92 +++++++++++++++++++ .../explore/SpaceDirectoryController.kt | 24 ++++- .../spaces/explore/SpaceDirectoryFragment.kt | 45 +++++++++ .../spaces/explore/SpaceDirectoryState.kt | 3 +- .../spaces/explore/SpaceDirectoryViewModel.kt | 20 ++++ .../manage/SpaceManageRoomsController.kt | 35 ++++--- .../main/res/drawable/ic_empty_icon_room.xml | 13 +++ .../layout/fragment_room_directory_picker.xml | 2 +- .../res/layout/item_generic_empty_state.xml | 70 ++++++++++++++ .../main/res/menu/menu_space_directory.xml | 15 +++ vector/src/main/res/values/strings.xml | 8 +- 11 files changed, 308 insertions(+), 19 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/core/ui/list/GenericEmptyWithActionItem.kt create mode 100644 vector/src/main/res/drawable/ic_empty_icon_room.xml create mode 100644 vector/src/main/res/layout/item_generic_empty_state.xml create mode 100644 vector/src/main/res/menu/menu_space_directory.xml diff --git a/vector/src/main/java/im/vector/app/core/ui/list/GenericEmptyWithActionItem.kt b/vector/src/main/java/im/vector/app/core/ui/list/GenericEmptyWithActionItem.kt new file mode 100644 index 0000000000..f8eb968268 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/ui/list/GenericEmptyWithActionItem.kt @@ -0,0 +1,92 @@ +/* + * 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.app.core.ui.list + +import android.content.res.ColorStateList +import android.view.View +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import androidx.core.view.isVisible +import androidx.core.widget.ImageViewCompat +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import im.vector.app.R +import im.vector.app.core.epoxy.VectorEpoxyHolder +import im.vector.app.core.epoxy.VectorEpoxyModel +import im.vector.app.core.extensions.setTextOrHide + +/** + * A generic list item to display when there is no results, with an optional CTA + */ +@EpoxyModelClass(layout = R.layout.item_generic_empty_state) +abstract class GenericEmptyWithActionItem : VectorEpoxyModel() { + + class Action(var title: String) { + var perform: Runnable? = null + } + + @EpoxyAttribute + var title: CharSequence? = null + + @EpoxyAttribute + var description: CharSequence? = null + + @EpoxyAttribute + @DrawableRes + var iconRes: Int = -1 + + @EpoxyAttribute + @ColorInt + var iconTint: Int? = null + + @EpoxyAttribute + var buttonAction: Action? = null + + override fun bind(holder: Holder) { + super.bind(holder) + + holder.titleText.setTextOrHide(title) + holder.descriptionText.setTextOrHide(description) + + if (iconRes != -1) { + holder.imageView.setImageResource(iconRes) + holder.imageView.isVisible = true + if (iconTint != null) { + ImageViewCompat.setImageTintList(holder.imageView, ColorStateList.valueOf(iconTint!!)) + } else { + ImageViewCompat.setImageTintList(holder.imageView, null) + } + } else { + holder.imageView.isVisible = false + } + + holder.actionButton.setTextOrHide(buttonAction?.title) + holder.actionButton.setOnClickListener { + buttonAction?.perform?.run() + } + } + + class Holder : VectorEpoxyHolder() { + val root by bind(R.id.item_generic_root) + val titleText by bind(R.id.emptyItemTitleView) + val descriptionText by bind(R.id.emptyItemMessageView) + val imageView by bind(R.id.emptyItemImageView) + val actionButton by bind