From 5c27d58dfa596bb3425457167e245faf07b3f2e6 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 3 Feb 2020 00:46:47 +0100 Subject: [PATCH] Update empty view for contacts Signed-off-by: Mario Danic --- .../nextcloud/talk/activities/BaseActivity.kt | 2 + .../data/presenters/AdvancedEmptyPresenter.kt | 4 +- .../contactsflow/contacts/ContactsView.kt | 21 +++++++++-- .../contacts/ContactsViewModel.kt | 5 ++- .../ConversationsListView.kt | 7 +++- .../talk/newarch/utils/Extensions.kt | 7 ++++ .../res/drawable/ic_undraw_not_found_60pq.xml | 37 +++++++++++++++++++ app/src/main/res/layout/message_state.xml | 6 +-- app/src/main/res/values/strings.xml | 1 + 9 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/ic_undraw_not_found_60pq.xml diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt index 01347075b..a370b1994 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt @@ -23,10 +23,12 @@ package com.nextcloud.talk.activities import android.annotation.SuppressLint import android.content.Context import android.os.Build +import android.os.Bundle import android.util.Log import android.view.WindowManager import android.webkit.SslErrorHandler import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate import com.nextcloud.talk.R import com.nextcloud.talk.events.CertificateEvent import com.nextcloud.talk.utils.SecurityUtils diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/presenters/AdvancedEmptyPresenter.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/presenters/AdvancedEmptyPresenter.kt index 42ff0b7d2..f6d36716b 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/presenters/AdvancedEmptyPresenter.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/presenters/AdvancedEmptyPresenter.kt @@ -23,15 +23,17 @@ package com.nextcloud.talk.newarch.data.presenters import android.content.Context +import android.view.View import com.otaliastudios.elements.Element import com.otaliastudios.elements.Page import com.otaliastudios.elements.extensions.EmptyPresenter -class AdvancedEmptyPresenter(context: Context, layout: Int, private val onViewClick: (() -> Unit)? = null) : EmptyPresenter(context, layout) { +class AdvancedEmptyPresenter(context: Context, layout: Int, private val onViewClick: (() -> Unit)? = null, private val bind: ((View) -> Unit)? = null) : EmptyPresenter(context, layout) { override fun onBind(page: Page, holder: Holder, element: Element, payloads: List) { super.onBind(page, holder, element, payloads) holder.itemView.setOnClickListener { onViewClick?.invoke() } + bind?.invoke(holder.itemView) } } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt index 0951b53b0..a621e687e 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt @@ -23,26 +23,32 @@ package com.nextcloud.talk.newarch.features.contactsflow.contacts import android.content.Context +import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.RelativeLayout import androidx.core.view.isVisible import androidx.lifecycle.observe import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import coil.api.load import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.nextcloud.talk.R import com.nextcloud.talk.controllers.ChatController import com.nextcloud.talk.models.json.participants.Participant +import com.nextcloud.talk.newarch.data.presenters.AdvancedEmptyPresenter import com.nextcloud.talk.newarch.features.contactsflow.ContactsViewOperationState import com.nextcloud.talk.newarch.features.contactsflow.groupconversation.GroupConversationView import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView import com.nextcloud.talk.newarch.utils.ElementPayload +import com.nextcloud.talk.newarch.utils.dp +import com.nextcloud.talk.newarch.utils.px import com.nextcloud.talk.utils.bundle.BundleKeys import com.otaliastudios.elements.Adapter import com.otaliastudios.elements.Element @@ -55,7 +61,6 @@ import kotlinx.android.synthetic.main.message_state.view.* import kotlinx.android.synthetic.main.search_layout.* import kotlinx.android.synthetic.main.search_layout.view.* import org.koin.android.ext.android.inject - class ContactsView(private val bundle: Bundle? = null) : BaseView() { override val scopeProvider: LifecycleScopeProvider<*> = ControllerScopeProvider.from(this) @@ -81,17 +86,25 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() { viewModel = viewModelProvider(factory).get(ContactsViewModel::class.java) val view = super.onCreateView(inflater, container) - // todo - change empty state magic val participantsAdapterBuilder = Adapter.builder(this) .addSource(ContactsViewSource(data = viewModel.contactsLiveData)) .addSource(ContactsHeaderSource(activity as Context, ParticipantElementType.PARTICIPANT_HEADER.ordinal)) .addSource(ContactsViewFooterSource(activity as Context, ParticipantElementType.PARTICIPANT_FOOTER.ordinal)) .addPresenter(ContactPresenter(activity as Context, ::onElementClick)) .addPresenter(Presenter.forLoadingIndicator(activity as Context, R.layout.loading_state)) - .addPresenter(Presenter.forEmptyIndicator(activity as Context, R.layout.message_state)) + .addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, null) { view -> + val layoutParams = view.messageStateImageView.layoutParams as RelativeLayout.LayoutParams + layoutParams.height = 128.px + layoutParams.width = 128.px + view.messageStateImageView.layoutParams = layoutParams + view.messageStateTextView.setText(R.string.nc_search_empty_contacts) + view.messageStateImageView.load(context.getDrawable(R.drawable.ic_undraw_not_found_60pq)) + view.messageStateImageView.imageTintList = null + }) .addPresenter(Presenter.forErrorIndicator(activity as Context, R.layout.message_state) { view, throwable -> view.messageStateTextView.setText(R.string.nc_oops) - view.messageStateImageView.setImageDrawable((activity as Context).getDrawable(R.drawable.ic_announcement_white_24dp)) + view.messageStateImageView.load((activity as Context).getDrawable(R.drawable.ic_announcement_white_24dp)) + view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) } }) .setAutoScrollMode(Adapter.AUTOSCROLL_POSITION_0, true) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt index bddcb4fb5..8c3367d4a 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt @@ -134,10 +134,11 @@ class ContactsViewModel constructor( } private fun loadContacts() { - getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, filterLiveData.value, conversationToken), object : + val searchQuery: String = if (filterLiveData.value.isNullOrBlank()) "" else filterLiveData.value.toString() + getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, searchQuery, conversationToken), object : UseCaseResponse> { override suspend fun onSuccess(result: List) { - val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 0) + val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 3) val sortedList = result.sortedWith(compareBy({ sortPriority[it.source] 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 33e2ffcae..d9ea0f98c 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 @@ -23,6 +23,7 @@ package com.nextcloud.talk.newarch.features.conversationslist import android.content.Context +import android.content.res.ColorStateList import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -51,6 +52,7 @@ import com.nextcloud.talk.newarch.features.contactsflow.contacts.ContactsView import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView +import com.nextcloud.talk.newarch.utils.px import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.animations.SharedElementTransition @@ -86,10 +88,13 @@ class ConversationsListView : BaseView() { .addSource(ConversationsListSource(viewModel.conversationsLiveData)) .addPresenter(ConversationPresenter(activity as Context, ::onElementClick, ::onElementLongClick)) .addPresenter(Presenter.forLoadingIndicator(activity as Context, R.layout.loading_state)) - .addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, ::openNewConversationScreen)) + .addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, ::openNewConversationScreen) { view -> + view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) } + }) .addPresenter(Presenter.forErrorIndicator(activity as Context, R.layout.message_state) { view, throwable -> view.messageStateTextView.setText(R.string.nc_oops) view.messageStateImageView.setImageDrawable((activity as Context).getDrawable(drawable.ic_announcement_white_24dp)) + view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) } }) .setAutoScrollMode(Adapter.AUTOSCROLL_POSITION_0, true) .into(view.recyclerView) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/Extensions.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/Extensions.kt index bf95a4b00..caf1abfa2 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/Extensions.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/Extensions.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.newarch.utils +import android.content.res.Resources import com.nextcloud.talk.models.database.UserEntity import com.nextcloud.talk.utils.ApiUtils import java.security.MessageDigest @@ -32,3 +33,9 @@ fun String.hashWithAlgorithm(algorithm: String): String { val bytes = digest.digest(this.toByteArray(Charsets.UTF_8)) return bytes.fold("", { str, it -> str + "%02x".format(it) }) } + +val Int.dp: Int + get() = (this / Resources.getSystem().displayMetrics.density).toInt() + +val Int.px: Int + get() = (this * Resources.getSystem().displayMetrics.density).toInt() \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_undraw_not_found_60pq.xml b/app/src/main/res/drawable/ic_undraw_not_found_60pq.xml new file mode 100644 index 000000000..09b67b199 --- /dev/null +++ b/app/src/main/res/drawable/ic_undraw_not_found_60pq.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/message_state.xml b/app/src/main/res/layout/message_state.xml index b5e798480..e8319a648 100644 --- a/app/src/main/res/layout/message_state.xml +++ b/app/src/main/res/layout/message_state.xml @@ -26,12 +26,12 @@ M3.27,4.27L19.74,20.74 Search for more participants New group + Where did they all hide?