From ef8dd28151b72f155d06e66f35da1610825a1b13 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Fri, 3 Jan 2020 23:36:13 +0100 Subject: [PATCH] Long click & other improvements --- .../talk/adapters/ConversationPresenter.kt | 8 ++- .../talk/adapters/ConversationsSource.kt | 30 -------- .../adapters/items/GenericTextHeaderItem.kt | 2 +- .../ConversationsListView.kt | 68 +++++++++++++++++-- .../layout/controller_conversations_rv.xml | 1 - 5 files changed, 70 insertions(+), 39 deletions(-) delete mode 100644 app/src/main/java/com/nextcloud/talk/adapters/ConversationsSource.kt diff --git a/app/src/main/java/com/nextcloud/talk/adapters/ConversationPresenter.kt b/app/src/main/java/com/nextcloud/talk/adapters/ConversationPresenter.kt index 31d60fe55..135cdaab8 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/ConversationPresenter.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/ConversationPresenter.kt @@ -45,7 +45,7 @@ import kotlinx.android.synthetic.main.rv_item_conversation_with_last_message.vie import org.koin.core.KoinComponent import org.koin.core.inject -open class ConversationsPresenter(context: Context, onElementClick: ((Page, Holder, Element) -> Unit)?) : Presenter(context, onElementClick), KoinComponent { +open class ConversationsPresenter(context: Context, onElementClick: ((Page, Holder, Element) -> Unit)?, private val onElementLongClick: ((Page, Holder, Element) -> Unit)?) : Presenter(context, onElementClick), KoinComponent { private val globalService: GlobalService by inject() override val elementTypes: Collection @@ -57,6 +57,12 @@ open class ConversationsPresenter(context: Context, onElementClick: ((Page, Hold override fun onBind(page: Page, holder: Holder, element: Element, payloads: List) { super.onBind(page, holder, element, payloads) + + holder.itemView.setOnLongClickListener { + onElementLongClick?.invoke(page, holder, element) + true + } + val conversation = element.data val user = globalService.currentUserLiveData.value diff --git a/app/src/main/java/com/nextcloud/talk/adapters/ConversationsSource.kt b/app/src/main/java/com/nextcloud/talk/adapters/ConversationsSource.kt deleted file mode 100644 index 62adbbcb7..000000000 --- a/app/src/main/java/com/nextcloud/talk/adapters/ConversationsSource.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * * Nextcloud Talk application - * * - * * @author Mario Danic - * * Copyright (C) 2017-2020 Mario Danic - * * - * * This program is free software: you can redistribute it and/or modify - * * it under the terms of the GNU General Public License as published by - * * the Free Software Foundation, either version 3 of the License, or - * * at your option) any later version. - * * - * * This program is distributed in the hope that it will be useful, - * * but WITHOUT ANY WARRANTY; without even the implied warranty of - * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * * GNU General Public License for more details. - * * - * * You should have received a copy of the GNU General Public License - * * along with this program. If not, see . - * - */ - -package com.nextcloud.talk.adapters - -import androidx.lifecycle.LiveData -import com.nextcloud.talk.models.json.conversations.Conversation -import com.otaliastudios.elements.extensions.LiveDataSource - -class ConversationsSource(data: LiveData>, elementType: Int) : LiveDataSource(data, elementType) { -} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.kt index e94905d31..ba87b21f1 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/GenericTextHeaderItem.kt @@ -66,7 +66,7 @@ class GenericTextHeaderItem(val model: String) : AbstractHeaderItem 0) { Log.d(TAG, "We have payloads, so ignoring!") } else { - holder.titleTextView!!.text = model + holder.titleTextView?.text = model } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index 29175e896..4e8a145a1 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -22,9 +22,13 @@ package com.nextcloud.talk.newarch.features.conversationsList import android.os.Bundle import android.view.* +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.appcompat.widget.SearchView import androidx.lifecycle.observe import butterknife.OnClick +import com.afollestad.materialdialogs.LayoutMode +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler @@ -36,10 +40,12 @@ import com.nextcloud.talk.adapters.ConversationsPresenter import com.nextcloud.talk.controllers.ContactsController import com.nextcloud.talk.controllers.SettingsController import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage +import com.nextcloud.talk.controllers.bottomsheet.items.listItemsWithImage import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.newarch.conversationsList.mvp.BaseView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView import com.nextcloud.talk.utils.ConductorRemapping +import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.animations.SharedElementTransition import com.nextcloud.talk.utils.bundle.BundleKeys import com.otaliastudios.elements.* @@ -74,6 +80,7 @@ class ConversationsListView : BaseView() { override fun onPrepareOptionsMenu(menu: Menu) { super.onPrepareOptionsMenu(menu) settingsItem = menu.findItem(R.id.action_settings) + settingsItem?.actionView?.transitionName = "userAvatar.transitionTag" viewModel.loadAvatar() } @@ -141,7 +148,7 @@ class ConversationsListView : BaseView() { val adapter = Adapter.builder(this) .addSource(Source.fromLiveData(viewModel.conversationsLiveData)) - .addPresenter(ConversationsPresenter(context, ::onElementClick)) + .addPresenter(ConversationsPresenter(context, ::onElementClick, ::onElementLongClick)) .addPresenter(Presenter.forLoadingIndicator(context, R.layout.loading_state)) .addPresenter(Presenter.forEmptyIndicator(context, R.layout.message_state)) .addPresenter(Presenter.forErrorIndicator(context, R.layout.message_state) { view, throwable -> @@ -149,7 +156,6 @@ class ConversationsListView : BaseView() { view.messageStateImageView.setImageDrawable(context.getDrawable(drawable.ic_announcement_white_24dp)) }) .into(view.recyclerView) - view.recyclerView.initRecyclerView(SmoothScrollLinearLayoutManager(activity), adapter, false) view.apply { recyclerView.initRecyclerView(SmoothScrollLinearLayoutManager(activity), adapter, false) @@ -189,16 +195,66 @@ class ConversationsListView : BaseView() { } } + private fun onElementLongClick(page: Page, holder: Presenter.Holder, element: Element) { + val conversation = element.data + + conversation?.let { conversation -> + activity?.let { activity -> + MaterialDialog(activity, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + cornerRadius(res = R.dimen.corner_radius) + title(text = conversation.displayName) + + listItemsWithImage(getConversationMenuItemsForConversation(conversation)) { dialog, index, item -> + when (item.iconRes) { + drawable.ic_star_border_black_24dp -> { + viewModel.changeFavoriteValueForConversation(conversation, false) + + } + drawable.ic_star_black_24dp -> { + viewModel.changeFavoriteValueForConversation(conversation, true) + } + drawable.ic_exit_to_app_black_24dp -> { + MaterialDialog(activity).show { + title(R.string.nc_leave) + message(R.string.nc_leave_message) + positiveButton(R.string.nc_simple_leave) { + viewModel.leaveConversation(conversation) + } + negativeButton(R.string.nc_cancel) + icon(drawable.ic_exit_to_app_black_24dp) + } + } + drawable.ic_delete_grey600_24dp -> { + MaterialDialog(activity).show { + title(R.string.nc_delete) + message(text = conversation.deleteWarningMessage) + positiveButton(R.string.nc_delete_call) { dialog -> + viewModel.deleteConversation(conversation) + } + negativeButton(R.string.nc_cancel) + icon( + drawable = DisplayUtils.getTintedDrawable( + resources!!, drawable + .ic_delete_grey600_24dp, R.color.nc_darkRed + ) + ) + } + } + else -> { + } + } + } + } + } + } + } + override fun getLayoutId(): Int { return R.layout.controller_conversations_rv } @OnClick(R.id.floatingActionButton) fun onFloatingActionButtonClick() { - openNewConversationScreen() - } - - private fun openNewConversationScreen() { val bundle = Bundle() bundle.putBoolean(BundleKeys.KEY_NEW_CONVERSATION, true) router.pushController( diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index b1208e7dc..24d3206c6 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -49,7 +49,6 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="16dp" - android:visibility="gone" app:backgroundTint="@color/colorPrimary" app:srcCompat="@drawable/ic_add_white_24px" app:tint="@color/white" />